javascript 和承诺:如何 refactor/flatten 以下嵌套承诺?
javascript and promise: how to refactor/flatten the following nested promises?
我是新手promise,正在看一段比较难看懂的代码:
return promise
.then(function helper0(instances) {
return helper1(instances, options)
.then(function helper2() {
return bluebird.delay(3000)
.then(function helper3() {
return helper4(localParams, options);
});
}
});
});
如何将其重构为 promise.then().then()...
?谢谢
嵌套 promise 是 known anti-pattern,您应该将它们链接起来:
// the structure is vertical instead of a nested pyramid
return promise
.then(function helper0(instances) {
return helper1(instances, options)
})
.then(function helper2() {
return bluebird.delay(3000);
})
.then(function helper3() {
return helper4(localParams, options);
});
从传递给 then
的回调中返回一个承诺,将该承诺添加到链中。
使用 arrow functions 可以进一步清理:
return promise
.then(instances => helper1(instances, options))
.then(() => bluebird.delay(3000))
.then(() => helper4(localParams, options);
但请注意,使用命名函数将是更好的调试方法,因为堆栈跟踪更具可读性。
假设您的函数也使用 Bluebird 承诺,您可以链接您的承诺,而不是像这样嵌套它们:
return promise.then(function helper0(instances) {
return helper1(instances, options).delay(3000);
}).then(function helper3() {
return helper4(localParams, options);
});
如果 helperX()
函数不一定 returning Bluebird 承诺,那么您可以这样做:
return promise.then(function helper0(instances) {
return helper1(instances, options);
}).then(function() {
return Bluebird.delay(3000);
}).then(function helper3() {
return helper4(localParams, options);
});
当您从 .then()
处理程序中 return 承诺时,会将承诺插入链中,链的其余部分等待该承诺完成,然后链继续进行。这使您可以像这样链接而不是嵌套所有内容。
我是新手promise,正在看一段比较难看懂的代码:
return promise
.then(function helper0(instances) {
return helper1(instances, options)
.then(function helper2() {
return bluebird.delay(3000)
.then(function helper3() {
return helper4(localParams, options);
});
}
});
});
如何将其重构为 promise.then().then()...
?谢谢
嵌套 promise 是 known anti-pattern,您应该将它们链接起来:
// the structure is vertical instead of a nested pyramid
return promise
.then(function helper0(instances) {
return helper1(instances, options)
})
.then(function helper2() {
return bluebird.delay(3000);
})
.then(function helper3() {
return helper4(localParams, options);
});
从传递给 then
的回调中返回一个承诺,将该承诺添加到链中。
使用 arrow functions 可以进一步清理:
return promise
.then(instances => helper1(instances, options))
.then(() => bluebird.delay(3000))
.then(() => helper4(localParams, options);
但请注意,使用命名函数将是更好的调试方法,因为堆栈跟踪更具可读性。
假设您的函数也使用 Bluebird 承诺,您可以链接您的承诺,而不是像这样嵌套它们:
return promise.then(function helper0(instances) {
return helper1(instances, options).delay(3000);
}).then(function helper3() {
return helper4(localParams, options);
});
如果 helperX()
函数不一定 returning Bluebird 承诺,那么您可以这样做:
return promise.then(function helper0(instances) {
return helper1(instances, options);
}).then(function() {
return Bluebird.delay(3000);
}).then(function helper3() {
return helper4(localParams, options);
});
当您从 .then()
处理程序中 return 承诺时,会将承诺插入链中,链的其余部分等待该承诺完成,然后链继续进行。这使您可以像这样链接而不是嵌套所有内容。