[英]typescript - while loop for promise
我有一个大数组,分成几个小块。 然后,我在每个块上进行异步调用:
myFunc(arrObjs: any[], chunkSize: number): Promise<any> {
let result = Promise.resolve(); // To start the chain
while(arrObjs.length) {
// Extracting array chunk
let chunk = arrObjs.splice(0, chunkSize);
// Building the chain
result = result.then(() => {
return someAsynFunc(
chunk
);
});
}
return result;
}
在我的解决方案之上。 我需要按顺序(系列承诺)运行异步函数,因此我建立了一个承诺链。
有没有更好的方法可以做到这一点?
是的,您可以使用reduce
模式:
function myFunc(arrObjs: any[], chunkSize: number): Promise<any> {
const chunks : any[] = [];
while (arrObjs.length) {
chunks.push(arrObjs.splice(0, chunkSize));
}
return chunks.reduce((p : Promise<any>, chunk : any[]) => {
return p.then(() => someAsyncFunc(chunk));
}, Promise.resolve());
}
(我认为我正确地使用了这些类型注释;如果没有,希望您可以阅读过去...)
请注意,我保留了您原来的行为,实际上是从arrObjs
数组中删除了数据,但通常我不主张像这样更改从调用方传递的对象。
这是一个例子:
function myFunc(arrObjs, chunkSize) { const chunks = []; while (arrObjs.length) { chunks.push(arrObjs.splice(0, chunkSize)); } return chunks.reduce((p, chunk) => { return p.then(() => someAsyncFunc(chunk)); }, Promise.resolve()); } function someAsyncFunc(chunk) { console.log("Start handling", JSON.stringify(chunk)); return new Promise(resolve => { setTimeout(() => { console.log("Done handling", JSON.stringify(chunk)); resolve(); }, 800); }); } const array = [0, 1, 2, 4, 5, 6, 7, 8, 9]; myFunc(array, 3).then(() => { console.log("Done"); });
还要注意,上面在处理它们之前先从数组中删除了所有块。 如果你想这样做, 因为他们正在处理(与任何产生串扰其他使用该数组,这可能添加/删除/等),你可以做同样的事情,只是没有reduce
:
// Cross-talky version
function myFunc(arrObjs : any[], chunkSize : number) : Promise<any> {
return new Promise<any>(function processChunk(resolve : function) {
const chunk : any[] = arrObjs.splice(0, chunkSize);
if (chunk.length == 0) {
resolve();
} else {
someAsyncFunc(chunk).then(() => processChunk(resolve));
}
});
}
// Cross-talky version function myFunc(arrObjs, chunkSize) { return new Promise(function processChunk(resolve) { const chunk = arrObjs.splice(0, chunkSize); if (chunk.length == 0) { resolve(); } else { someAsyncFunc(chunk).then(() => processChunk(resolve)); } }); } function someAsyncFunc(chunk) { console.log("Start handling", JSON.stringify(chunk)); return new Promise(resolve => { setTimeout(() => { console.log("Done handling", JSON.stringify(chunk)); resolve(); }, 800); }); } const array = [0, 1, 2, 4, 5, 6, 7, 8, 9]; myFunc(array, 3).then(() => { console.log("Done"); }); setTimeout(() => { array.splice(2, 0, 'cross', 'talk'); }, 1000);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.