如何创建一个承诺循环

时间:2017-03-19 14:42:52

标签: javascript promise

所以我承诺从服务器收集数据,但一次只收集50个响应。我收集了250份回复。

我可以像下面一样联合承诺

new Promise((resolve, reject) => {
    resolve(getResults.get())
    })
    .then((results) => {
    totalResults.concat(results)
    return getResults.get()
    })
    .then((results) => {
    totalResults.concat(results)
    return getResults.get()
    }).then((results) => {
     totalResults.concat(results)
    return getResults.get()
    })

在这种情况下,我只需要250个结果,所以这似乎是一个可管理的解决方案,但是有一种方法可以在一个循环中结合promises。所以我运行一个循环5次,每次运行下一个承诺。

对不起,我是承诺的新手,如果这是回调,这就是我要做的。

2 个答案:

答案 0 :(得分:8)

可能你只需要Promise.all方法。 对于每个请求,您应该创建一个promise并将其放在一个数组中,然后用all方法包装所有内容并完成。

示例(假设getResults.get返回一个承诺):

let promiseChain = [];
for(let i = 0; i <5; i++){
    promiseChain.push(getResults.get());
}

Promise.all(promiseChain)
    .then(callback)

您可以在此处详细了解此方法: Promise.all at MDN

修改 您可以通过以下方式访问promises返回的数据:

function callback(data){
    doSomething(data[0]) //data from the first promise in the chain
    ...
    doEventuallySomethingElse(data[4]) //data from the last promise
}

答案 1 :(得分:8)

如果你想循环并序列化promises,一旦失败就不执行任何其他get调用,那么试试这个循环:

function getAllResults() { // returns a promise for 250 results
    let totalResults = [];
    let prom = getResults.get();
    for (let i = 0; i < 4; i++) { // chain four more times
        prom = prom.then(results => {
            totalResults = totalResults.concat(results);
            return getResults.get();
        });
    }
    return prom.then( results => totalResults.concat(results) );
}

请注意,您应该避免使用promise construction anti-pattern。这里没有必要使用new Promise

还要考虑在上述函数返回的promise上添加.catch()调用,以处理错误情况。

最后,请注意concat不会修改您调用它的数组。它返回连接数组,因此您需要指定该返回值。在您的代码中,您没有指定返回值,因此调用无效。