Javascript 有没有办法在延期承诺中提前返回?
因此,我有一个承诺,其中包含像这样的多张支票Javascript 有没有办法在延期承诺中提前返回?,javascript,promise,q,Javascript,Promise,Q,因此,我有一个承诺,其中包含像这样的多张支票 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")
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'中是否有类似return的东西可以使代码看起来更好?例如:
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返回之前返回的,但我想知道是否有类似于返回的东西?尽量不要创建一个延迟,它可能会被函数的多个部分拒绝,并且需要在每个退出点返回。
相反,使用单独的承诺编写代码,每个承诺对应于控制流的每个分支。您可以使用和-避免不推荐的延迟模式。然后,您的函数将如下所示:
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.reject(…)代码>你可以做扔代码>
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为什么不使用如果(通过)
继续,然后在函数的最后,您可以进行一次测试,看看是否应该拒绝。在每种情况下,您都可以返回deferred.promise,而不是只返回。但是这会很混乱。函数需要首先返回一个承诺,因此它首先返回一个承诺,然后拒绝它。您不能执行return delferred.reject()
,因为它不返回承诺,并且会抛出错误。这样做可以避免金字塔。但是您可以简单地deferred.reject();回报。承诺代码>(如果您不想使用我的答案中更简单的版本)。不需要异步回调。