是否可以在每个 promise 完成后 运行 回调,然后在所有 promise 完成后再回调?
Is it possible to run callback after each promise completes and then another when all complete?
我愿意
- 创建一系列承诺(通过 jQuery get/post 调用 API)
- 运行 每个完成后的代码(例如进度指示器)
- 运行(不同)代码在 全部 完成后
怎么做到的?
类似的东西 - 但请参阅第 5 行评论中的问题
var urls = []; // a bunch of URLs
Promise.all(
urls.map(e => {
return $.post(e);
// do something here after post has succeded
/// but still return a promise
})
).then(d => {
// do something when all succeed
}).catch(e => {
console.log(e)
})
我可以使用 Bluebird
我觉得你的问题很清楚,不用一堆代码。重要的是要理解 .then()
return 是一个承诺。这意味着您可以在单个承诺通过调用 then()
解决并保存 then()
中的 return 值时进行工作,这也是数组中的承诺。您将该数组传递给 Promise.all()
,它将在数组中的所有承诺都已解决时解决:
/* some async function */
let asyncFn = () => new Promise(resolve => setTimeout(() => resolve(Math.random()), Math.floor(Math.random() * 1500)))
let promises = []
for (let i = 0; i < 10; i++) {
let p = asyncFn() // then() returns a promise, save it in the array:
.then((r) => { // do work for each promise
console.log('done:', i, "returned: ", r)
return r // Promise.all() will received these values as an array
})
promises.push(p) // promises is array of promises
}
// Promise.all() runs when all promises in array have resolved
Promise.all(promises)
.then((arr) => console.log("Everything finished. Final values: ", arr))
我愿意
- 创建一系列承诺(通过 jQuery get/post 调用 API)
- 运行 每个完成后的代码(例如进度指示器)
- 运行(不同)代码在 全部 完成后
怎么做到的?
类似的东西 - 但请参阅第 5 行评论中的问题
var urls = []; // a bunch of URLs
Promise.all(
urls.map(e => {
return $.post(e);
// do something here after post has succeded
/// but still return a promise
})
).then(d => {
// do something when all succeed
}).catch(e => {
console.log(e)
})
我可以使用 Bluebird
我觉得你的问题很清楚,不用一堆代码。重要的是要理解 .then()
return 是一个承诺。这意味着您可以在单个承诺通过调用 then()
解决并保存 then()
中的 return 值时进行工作,这也是数组中的承诺。您将该数组传递给 Promise.all()
,它将在数组中的所有承诺都已解决时解决:
/* some async function */
let asyncFn = () => new Promise(resolve => setTimeout(() => resolve(Math.random()), Math.floor(Math.random() * 1500)))
let promises = []
for (let i = 0; i < 10; i++) {
let p = asyncFn() // then() returns a promise, save it in the array:
.then((r) => { // do work for each promise
console.log('done:', i, "returned: ", r)
return r // Promise.all() will received these values as an array
})
promises.push(p) // promises is array of promises
}
// Promise.all() runs when all promises in array have resolved
Promise.all(promises)
.then((arr) => console.log("Everything finished. Final values: ", arr))