javascript循环 promise 在参数中迭代数组

标签 javascript promise

我正在尝试遍历要完成的 AsynWork 数组。并且不能用同时完成的异步工作淹没系统。所以我试着用 promise 来一个一个地做。我的问题是我需要遍历一个值数组,以便每个异步都对数组的每个值起作用。我设法用这段代码做到了,但它适用于我的具体情况。不能让它通用。使它可重用于其他类型的数组的方法是什么?我已经看到一些解决方案 array.reduce then promises 但无法弄清楚。也看过用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)

最佳答案

你想多了 :) 带参数的函数与不带参数的函数相同,关闭带参数的函数所以:

a(1,2,3,4);

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

除了慢得可以忽略不计。我假设您需要为任意 数量的 promise 对工作进行排队。如果您需要为固定数字执行此操作 - 您可以在它们之间 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 前一个返回的已解决之后执行下一个。

值基于 promise 解析(通过 then)相互等待。这会让你做:

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

关于javascript循环 promise 在参数中迭代数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35572542/

相关文章:

javascript - AngularJS 设置 html 属性

node.js - 将 promise 的结果链接并传递给进一步的 promise

javascript - NodeJS 中使用 bluebird Promise 的链函数

javascript - 使用 Q,js 进行 ajax 调用

node.js - 在运行测试之前, Mocha 似乎不会等待 promise 链完成

javascript - React 中的 onClick 这样的事件会污染内存堆吗?

javascript - 在 python 中抓取 javascript 页面

javascript - Ffmpeg 在 AWS Lambda 函数中返回错误代码 1

javascript - jQuery 在选项卡中打开 PDF - 正在打开其他选项卡

javascript - 我违背了我的 promise