【发布时间】:2017-04-19 06:15:04
【问题描述】:
Promise 新手;考虑存在promiseA() 和promiseB(a) 的情况,这取决于第一个结果,我想从两者收集结果并执行第三个操作doSomething(a, b):
样式 A(闭合/嵌套)
promiseA().then(function (resultA) {
return (promiseB(resultA).then(function (resultB) {
doSomething(resultA, resultB);
}));
});
样式 B(返回值/链接)
promiseA().then(function (resultA) {
return Promise.all([resultA, promiseB(resultA)]);
}).spread(function (resultA, resultB) {
doSomething(resultA, resultB);
});
据我所知,这些是等价的:
-
promiseA和promiseB之间的排序约束相同 - 最终承诺返回
undefined - 如果
promiseA或promiseB被拒绝,或doSomething抛出,则最终承诺将被拒绝。
就风格而言,风格 B 减少了缩进(厄运金字塔)。
但是,样式 B 更难重构。如果我需要引入中间的promiseA2(a) 和doSomething(a, a2, b),我需要修改 3 行(Promise.all、spread、doSomething),这可能会导致错误(意外交换等),而使用 Style A I仅修改 1 行 (doSomething) 并且变量名称清楚地表明它是哪个结果。在大型项目中,这可能很重要。
这两种风格之间是否还有其他非功能性的权衡?一个与另一个的更多/更少的内存分配?更多/更少的事件循环?更好/更差的异常堆栈跟踪?
【问题讨论】:
-
const resultA = await promiseA(); const resultB = await promiseB(resultA); doSomething(resultA, resultB);
标签: javascript scope promise