是的,你总是可以用以下方法压平承诺链Promise.all
(速记通过Promise.join
在 Bluebird 中)通过使用 Promise 作为代理。毕竟 - Promise 是抽象值,您始终可以根据需要随时解开 Promise,并让其他变量依赖于它。
它是否更具可读性是另一个争论:
foo().then(function(a){
return bar(a).then(function(b){
return g(a,b); // "needed" to nest because I wanted `a`
});
});
可以写成:
var a = foo();
var b = a.then(bar);
Promise.join(a, b, function(a,b){
return g(a, b); // alternatively, res could have been `Promise.join(a,b, g)`
});
所以一般来说 - 你can始终避免嵌套,但很多时候您可能不想这样做。
就您而言,这甚至可以是:
function authenticate() {
var userPass = Promise.all([ getUsername().then(getUser), getPassword()]);
var passHash = userPass.get(0).get("passwordHash");
var newHash = userPass.get(1).then(hash);
var equal = Promise.join(userHash, newHash, function(a, b){ return a !==b });
return equal.then(function(val){ if(!val) throw new Error("..."); });
}
奉承?当然。更好的?那是另一个问题了。如果你有一个嵌套的for
循环,您可能希望将其保留为嵌套for
循环和嵌套,而不是绕过该选项并使用单个循环。