javascript循环承诺使用参数中的数组进行迭代

javascript循环承诺使用参数中的数组进行迭代,javascript,promise,Javascript,Promise,我正试图通过一系列需要完成的工作来进行循环。并且不能同时完成异步工作来淹没系统。所以我试着一个接一个地做承诺。我的问题是,我需要遍历一个值数组,这样每个异步都可以处理数组中的每个值。我用这段代码成功地做到了这一点,但它适用于我的具体情况。不能笼统地说。如何使其可用于其他类型的阵列?我已经看到了array.reduce的一些解决方案,但我无法解决。也看到过使用Q但不使用的示例,如果可以使用简单的javascript来实现,则效果会更好 我的代码: function doSomething(ObjI

我正试图通过一系列需要完成的工作来进行循环。并且不能同时完成异步工作来淹没系统。所以我试着一个接一个地做承诺。我的问题是,我需要遍历一个值数组,这样每个异步都可以处理数组中的每个值。我用这段代码成功地做到了这一点,但它适用于我的具体情况。不能笼统地说。如何使其可用于其他类型的阵列?我已经看到了array.reduce的一些解决方案,但我无法解决。也看到过使用Q但不使用的示例,如果可以使用简单的javascript来实现,则效果会更好

我的代码:

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,然后用“填充的”值构建序列数组并工作