我有一个异步函数,它发出一个请求,makeRequest(): Promise<string>。基本上,我希望对此函数的调用进行排队,以便一次只发出一个请求。
async function queueRequest(): Promise<string> {
await ... // some code to make sure all previous requests have already been completed
const result = await makeRequest();
return result;
}实现这样的目标最好的方法是什么?
提前感谢
发布于 2020-10-13 22:39:35
要做到这一点,您需要使用一个数组,在该数组中,您移动一个任务并推送新的传入任务。
我将使用fastq来避免重新实现管理队列数据结构的所有逻辑。
下面是一个示例:
const queue = require('fastq')(worker, 1)
function worker (params, cb) {
console.log('Executing ', params)
setTimeout(() => {
cb(null, { i: params })
}, Math.random() * 100)
}
function makeRequest (params) {
return new Promise((resolve, reject) => {
queue.push(params, function (err, result) {
if (err) { return reject(err) }
resolve(result)
})
})
}
async function queueRequest (index) {
const result = await makeRequest(index)
// manage the result
return result
}
for (let i = 0; i < 10; i++) {
queueRequest(i)
}发布于 2020-10-13 22:55:15
这段代码来自MDN page on Promises。他们有更多的例子,紧跟我下面的例子,以便在此基础上进行一点扩展。
使用一些聪明的JavaScript可以实现
顺序组合:
[func1, func2, func3].reduce((p, f) => p.then(f), Promise.resolve())
.then(result3 => { /* use result3 */ });基本上,我们将一个异步函数数组缩减为一个promise链,相当于: Promise.resolve().then(func1).then(func2).then(func3);:
Here是一篇很好的文章,它介绍了如何使用reduce()来实现连续承诺的目标。与MDN文档相比,它在浏览和解释每个步骤方面做得很好。
https://stackoverflow.com/questions/64336639
复制相似问题