所以我有一个包含多个支票的承诺
function test(){
var deferred = q.defer()
var passed = false
if(!passed){
deferred.reject("Don't proceed")
//return
} else {
if(!passed){
deferred.reject("Don't proceed")
} else {
if(!passed){
deferred.reject("Don't proceed")
} else {
setTimeout(function(){
console.log("Hello");
deferred.resolve()
}, 100);
}
}
}
return deferred.promise
}
这看起来很糟糕,因为底部有一个金字塔。我想知道有什么像'q'中的返回可以使代码看起来更好吗?例如:
function test(){
var deferred = q.defer()
var passed = false
if(!passed){
deferred.reject("Don't proceed")
return
}
if(!passed){
deferred.reject("Don't proceed")
return
}
if(!passed){
deferred.reject("Don't proceed")
return
}
setTimeout(function(){
console.log("Hello");
deferred.resolve()
}, 100);
return deferred.promise
}
这肯定不起作用,因为它在返回promise之前返回,但我想知道是否有类似返回的内容?
答案 0 :(得分:1)
尽量不要创建单个延迟,可以从函数的多个部分中拒绝,并且在每个出口点都需要返回。
相反,代码具有单独的promise,一个用于控制流的每个分支。您可以使用Q.reject
和Q.Promise
constructor - 避免使用已弃用的延迟模式。您的功能将如下所示:
function test() {
var deferred = q.defer()
var passed = false
if (!passed)
return Q.reject("Don't proceed");
if (!passed)
return Q.reject("Don't proceed");
if (!passed)
return Q.reject("Don't proceed");
// else
return new Promise(function(resolve) {
setTimeout(function(){
console.log("Hello");
resolve();
}, 100);
});
}
或者,您可以将test
功能包装在Q.fbind
中,这样您就可以return Q.reject(…);
而不是写throw …;
。
答案 1 :(得分:0)
function test(){
var deferred = q.defer()
var passed = false
if(true){
deferred.reject(new Error("Don't proceed1"))
return deferred.promise
}
if(!passed){
deferred.reject(new Error("Don't proceed2"))
return deferred.promise
}
if(!passed){
deferred.reject(new Error("Don't proceed3"))
return deferred.promise
}
setTimeout(function(){
console.log("Hello");
deferred.resolve()
});
return deferred.promise
}
我认为这是最好的方式,感谢Bergi