ES6 Promises/calling 实现多个 promise 后的函数(不能使用 Promises.all)
ES6 Promises/calling a function after multiple promises are fulfilled (can't use Promises.all)
我正在写 Javascript 需要这些事件按此顺序发生:
- 同时触发多个 API 调用
- 所有调用完成且响应返回后,执行一行代码
听起来很简单,但棘手的部分是我不能使用 Promises.all() 因为我仍然希望在所有承诺都已实现后执行该行代码,无论是否成功。除非我误解了 Promises.all(),一个失败会导致代码行在 then() 中不执行而在 error() 中执行得太快。
我很可能遗漏了一些明显的东西,但我能看到的唯一其他方法是将 API 调用承诺链接在一起,但这会导致不会立即触发它们。所以基本上我认为我需要 Promises.all() 的一个版本,它不是 "fail-fast".
执行此操作的正确方法是什么?
要严格使用 ES6 promise 来做到这一点,您需要将每个 promise 包装在另一个包装器 promise 中,当包装的 promise 被履行或拒绝时,它会得到解决。
你可以这样做:
Promise.all(
promises.map( promise => Promise.resolve( promise ).catch( _=>_ ) )
).then ( function ( ) {
// All promises finished
} );
这假设 promises
是一组承诺 and/or 值。
可能有比这更巧妙的方法,甚至是这种特定方法的更好的书面版本,但不是使用 Promise.all,您可以将行为链接到每个 promise(对于 then 和 catch,所以没关系)更新主 Promise 中的值。
const allPromises = arrayOfPromises => Promise((resolve,reject)=> {
const ln = arrayOfPromises.length,
done = 0;
const allDone => _ => {
if(++done===ln){ resolve(); }
}
arrayOfPromises.map(p=>p.then(allDone).catch(allDone));
});
我正在写 Javascript 需要这些事件按此顺序发生:
- 同时触发多个 API 调用
- 所有调用完成且响应返回后,执行一行代码
听起来很简单,但棘手的部分是我不能使用 Promises.all() 因为我仍然希望在所有承诺都已实现后执行该行代码,无论是否成功。除非我误解了 Promises.all(),一个失败会导致代码行在 then() 中不执行而在 error() 中执行得太快。
我很可能遗漏了一些明显的东西,但我能看到的唯一其他方法是将 API 调用承诺链接在一起,但这会导致不会立即触发它们。所以基本上我认为我需要 Promises.all() 的一个版本,它不是 "fail-fast".
执行此操作的正确方法是什么?
要严格使用 ES6 promise 来做到这一点,您需要将每个 promise 包装在另一个包装器 promise 中,当包装的 promise 被履行或拒绝时,它会得到解决。
你可以这样做:
Promise.all(
promises.map( promise => Promise.resolve( promise ).catch( _=>_ ) )
).then ( function ( ) {
// All promises finished
} );
这假设 promises
是一组承诺 and/or 值。
可能有比这更巧妙的方法,甚至是这种特定方法的更好的书面版本,但不是使用 Promise.all,您可以将行为链接到每个 promise(对于 then 和 catch,所以没关系)更新主 Promise 中的值。
const allPromises = arrayOfPromises => Promise((resolve,reject)=> {
const ln = arrayOfPromises.length,
done = 0;
const allDone => _ => {
if(++done===ln){ resolve(); }
}
arrayOfPromises.map(p=>p.then(allDone).catch(allDone));
});