javascript – 如何使用Promise.all避免promise构造函数反模式
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – 如何使用Promise.all避免promise构造函数反模式,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2190字,纯文字阅读大概需要4分钟。
内容图文
![javascript – 如何使用Promise.all避免promise构造函数反模式](/upload/InfoBanner/zyjiaocheng/750/6d794f2289404025b2730a261d396725.jpg)
在使用多个promise和Promise.all时,如何避免promise构造函数反模式?
说我有以下代码:
getFoo = function() {
return new Promise(function(resolve, reject) {
var promises = [];
promises.push(new Promise(function(resolve, reject) => {
getBar1().then(function(bar1) {
processBar1(bar1);
resolve(bar1);
});
}));
promises.push(new Promise(function(resolve, reject) => {
getBar2().then(function(bar2) {
processBar2(bar2);
resolve(bar2);
});
}));
Promise.all(promises).spread(function(bar1, bar2) {
var result = processBothBars(bar1, bar2);
resolve(result);
});
});
}
它提出了反模式的一些基本问题,错误被吞噬,以及厄运的金字塔.
我正在使用蓝鸟BTW.
解决方法:
你可以一起摆脱新的Promise.
getFoo = function() {
var promises = [];
promises.push(getBar1().then(function(bar1) {
processBar1(bar1);
return bar1;
}));
promises.push(getBar2().then(function(bar2) {
processBar2(bar2);
return bar2;
}));
return Promise.all(promises).spread(function(bar1, bar2) {
var result = processBothBars(bar1, bar2);
return result;
});
}
// start mock
function getBar1() {
return Promise.resolve({name:'bar1',processed: false});
}
function getBar2() {
return Promise.resolve({name:'bar2',processed: false});
}
function processBar1(bar1) {
bar1.processed = true;
}
function processBar2(bar2) {
bar2.processed = true;
}
function processBothBars (bar1, bar2) {
return [bar1, bar2].filter(function (bar) {
return bar.processed;
}).map(function (bar) {
return bar.name;
});
}
Promise.prototype.spread = function (fn) {
return this.then(function (arr) {
return fn.apply(this, arr);
});
};
// end mock
var getFoo = function (fail) {
var promises = [];
promises.push(getBar1().then(function (bar1) {
processBar1(bar1);
if (fail) {
throw 'getBar1 Failed!';
}
return bar1;
}));
promises.push(getBar2().then(function (bar2) {
processBar2(bar2);
return bar2;
}));
return Promise.all(promises).spread(function (bar1, bar2) {
var result = processBothBars(bar1, bar2);
return result;
});
}
getFoo().then(function (result) {
console.log(result); // ['bar1', 'bar2']
});
getFoo(true).then(function (result) {
console.log(result); // doesn't happen
}).catch(function (e) {
console.error(e); // Error: getBar1 Failed!
});
.then返回一个promise,因此除非你想防止错误到达外部promise,否则不需要创建一个包装它的新的promise.
内容总结
以上是互联网集市为您收集整理的javascript – 如何使用Promise.all避免promise构造函数反模式全部内容,希望文章能够帮你解决javascript – 如何使用Promise.all避免promise构造函数反模式所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。