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

时间:2016-02-23 08:36:44

标签: javascript promise

我正在尝试遍历AsynWork数组。并且当时所有的异步工作都无法充斥系统。所以我试图用承诺一个接一个地做。我的问题是我需要通过一个值数组,以便每个异步都适用于数组的每个值。我设法用这个代码做了,但它适用于我的具体情况。不能使它一般。将其重用为其他类型的数组的方法是什么?我已经看到一些解决方案与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)

1 个答案:

答案 0 :(得分:6)

你是在思考这个问题:)一个带参数的函数与一个没有参数的函数相同,该函数用函数关闭一个函数,所以:

a(1,2,3,4);

相同
(() => a(1,2,3,4))(); 

除了可能忽略不计的速度之外。我假设您需要为任意数量的承诺排队工作。如果您需要使用固定数字 - 它们之间只能then。让我们看看我们如何做到这一点:

// 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
}

请务必先了解reduce。为方便起见 - 让我们看一个没有它的例子:

function sequence(fns) { // fns - functions returning promises
    var queue = Promise.resolve();
    fns.forEach(fn => queue = queue.then(fn));
    return queue;
}

我们正在迭代我们的工作数组(函数)并一个接一个地执行它们,在我们执行下一个返回解析的promise之后的下一个。

值根据承诺解析(通过then)等待彼此。这可以让你做到:

sequence([
   () => new Promise(r => setTimeout(r, 500));
   () => console.log("I only run after the previous work completed");
]);