所以我承诺从服务器收集数据,但一次只收集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次,每次运行下一个承诺。
对不起,我是承诺的新手,如果这是回调,这就是我要做的。
答案 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
不会修改您调用它的数组。它返回连接数组,因此您需要指定该返回值。在您的代码中,您没有指定返回值,因此调用无效。