javascript循环承诺使用参数中的数组进行迭代
我正试图通过一系列需要完成的工作来进行循环。并且不能同时完成异步工作来淹没系统。所以我试着一个接一个地做承诺。我的问题是,我需要遍历一个值数组,这样每个异步都可以处理数组中的每个值。我用这段代码成功地做到了这一点,但它适用于我的具体情况。不能笼统地说。如何使其可用于其他类型的阵列?我已经看到了array.reduce的一些解决方案,但我无法解决。也看到过使用Q但不使用的示例,如果可以使用简单的javascript来实现,则效果会更好 我的代码:javascript循环承诺使用参数中的数组进行迭代,javascript,promise,Javascript,Promise,我正试图通过一系列需要完成的工作来进行循环。并且不能同时完成异步工作来淹没系统。所以我试着一个接一个地做承诺。我的问题是,我需要遍历一个值数组,这样每个异步都可以处理数组中的每个值。我用这段代码成功地做到了这一点,但它适用于我的具体情况。不能笼统地说。如何使其可用于其他类型的阵列?我已经看到了array.reduce的一些解决方案,但我无法解决。也看到过使用Q但不使用的示例,如果可以使用简单的javascript来实现,则效果会更好 我的代码: function doSomething(ObjI
function doSomething(ObjIn1, ObjIn2) {
return new Promise(function(resolve, reject) {
console.log("doSomething: ObjIn1: " + ObjIn1 + " ObjIn2: " + ObjIn2);
setTimeout(function() {
console.log("doSomething Done: ObjIn1: " + ObjIn1 + " ObjIn2: " + ObjIn2);
resolve(ObjIn1, ObjIn2);
}, 500);
})
}
function LoopPromises(Function2Loop, functionOptions, Counter, Max) {
console.log("Counter: " + Counter);
if (Counter < Max) {
Function2Loop.apply(this, [functionOptions[0][Counter], functionOptions[1]]).then(function() {
Counter++;
LoopPromises(Function2Loop, functionOptions, Counter, Max);
});
}
}
LoopPromises(doSomething, [
["A1", "A2", "A3"], "ARG2TESTE"
], 0, 3)
函数doSomething(ObjIn1,ObjIn2){
返回新承诺(功能(解决、拒绝){
日志(“doSomething:ObjIn1:+ObjIn1+”ObjIn2:+ObjIn2”);
setTimeout(函数(){
日志(“doSomething Done:ObjIn1:+ObjIn1+”ObjIn2:+ObjIn2”);
解决(ObjIn1,ObjIn2);
}, 500);
})
}
函数循环(Function2Loop、functionOptions、计数器、最大值){
控制台日志(“计数器:+计数器);
如果(计数器<最大值){
Function2Loop.apply(此[functionOptions[0][Counter],functionOptions[1]]),然后(function(){
计数器++;
循环承诺(Function2Loop、functionOptions、计数器、最大值);
});
}
}
我的承诺(doSomething[
[“A1”、“A2”、“A3”]、“ARG2TESTE”
], 0, 3)
您想得太多了:)带参数的函数与不带参数的函数相同,因此:
a(1,2,3,4);
与
(() => a(1,2,3,4))();
除了可能慢得可以忽略不计。我假设你需要排队等待任意数量的承诺。如果您需要为固定号码执行此操作,您只需然后在它们之间执行。让我们看看如何做到这一点:
// runs fn on the array elements in sequence, but
function sequence(fns) { // fns - functions returning promises
return fns.reduce((prev, nextFn) => { // 'fold' the array
return prev.then(nextFn); // after the previous is done, execute the next
}, Promise.resolve()); // start with an empty promise
}
确保你首先理解。为了方便起见,让我们看一个没有它的示例:
function sequence(fns) { // fns - functions returning promises
var queue = Promise.resolve();
fns.forEach(fn => queue = queue.then(fn));
return queue;
}
我们正在迭代我们的工作(函数)数组,并一个接一个地执行它们,在前一个返回的承诺得到解决后执行下一个
其中,值根据承诺相互等待(通过然后)。这将使您能够:
sequence([
() => new Promise(r => setTimeout(r, 500));
() => console.log("I only run after the previous work completed");
]);
嗨,非常感谢你的见解。这是一个非常好的方法。很难看出函数是如何循环的,但是一旦你知道了,就很好了。我必须编辑一些代码才能工作:sequence([()=>doSomething(“ObjIn1”,“ObjIn2”),()=>console.log(“我只在前一个工作完成后运行”);现在在构建函数数组时遇到了一些问题。我正在对一组要处理的图像进行for循环。但是当我执行SequenceOfEditImage.push(()=>EditImage(imagesArray[i]);//我遇到了问题,因为SequenceOfEditImage.push函数上不存在i键。知道怎么做吗?我是这样做的:for(var i=0;(iEditImage(ImagesArray[i]);}但现在我改为array.reduce,然后用“填充的”值构建序列数组并工作