javascript - 有没有办法自定义promise.all?
问题描述
根据当前的行为,Promise.all() 方法返回一个单一的 Promise,当作为迭代传递的所有承诺都已解决或当迭代不包含任何承诺时,该 Promise 将解决。它以第一个拒绝的承诺的原因拒绝。
例如:
var promise1 = Promise.resolve(3);
var promise2 = 42;
var promise3 = new Promise(function(resolve, reject) {
setTimeout(resolve, 100, 'foo');
});
Promise.all([promise1, promise2, promise3]).then(function(values) {
console.log(values);
});
// expected output: Array [3, 42, "foo"]
目前,我正在尝试实现类似于(Like, ) 的polyfill ,其中第一个承诺的结果将被提供给下一个承诺。promise.all
promise.sequenceAll
var promise1 = Promise.resolve(3);
var promise2 = 42;
var promise3 = new Promise(function(resolve, reject) {
setTimeout(resolve, 100, 'foo');
});
Promise.sequenceAll([promise1, promise2, promise3]).then(function(values) {
console.log(values);
});
预期输出:promise1 的结果将作为参数传递给 promise2。如果任何一个 Promise 被拒绝,那么它将执行promise.catch();
解决方案
您可以这样做并从处理程序返回第一个承诺的已解决值,.then()
这将使其成为结果承诺的已解决值:
Promise.all([promise1, promise2, promise3]).then(([v1]) => {
// make the resolved value of the first promise be the resolved value
// of the subsequent promise
return v1;
}).then((value) => {
// v1 is now the resolved value of the chain
console.log(value);
});
您可以根据需要将该行为封装在您自己的函数中,尽管当您需要此行为时,只需将.then()
处理程序添加到现有函数中非常容易。Promise.all()
推荐阅读
- html - Favicon 没有出现在 Google 搜索结果中?
- php - 忽略 woocommerce_product_image_upload_error 并保存产品
- matlab - 将矩阵转换为二进制值
- php - 作业尝试次数过多或运行时间过长
- javascript - http 中的 SVG 脚本
- javascript - 在这个问题中我是否需要使用 clearTimeout() 并将超时设置为空?
- jquery - 字体真棒图标不会移动
- ios - 添加注释权限后获取无效的代码签名权利(iOS 13)
- facebook - Azure Functions 和 Facebook 登录
- c# - C# 中的 Windows 10 语言更改弹出菜单焦点问题