有没有办法提前退还延期承诺? [英] Is there a way to return early in deferred promise?
问题描述
所以我有一个包含多个这样的支票的承诺
So I have a promise which contains multiple checks like this
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'中的返回可以使代码看起来更好吗?例如:
This looks bad because there is a pyramid at the bottom. I'm wondering is there something like return in 'q' which can make the code look better? For example like this:
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之前返回,但我想知道是否有类似返回的内容?
This definitely doesn't work because it returned before promise is returned, but I'm wondering is there something like a return?
推荐答案
尽量不要创建单个延迟,这可能会从函数的多个部分中被拒绝,并且您需要在每个出口点返回。
相反,代码具有单独的promise,一个用于控制流的每个分支。您可以使用 Q.reject
和 Q.Promise
构造函数 - 避免使用已弃用的延迟模式。您的函数将如下所示:
Try not to create a single deferred, that could be rejected from multiple parts of your function, and which you would need to return at every exit point.
Instead, code with separate promises, one for each branch of control flow you have. You can use Q.reject
and the Q.Promise
constructor - avoid the deprecated deferred pattern. Your function would then look like this:
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);
});
}
或者,您可以包装测试
Q.fbind
,这样代替写返回Q.reject(...);
你可以做 throw ...;
。
Alternatively, you can wrap your test
function in Q.fbind
, so that instead of writing return Q.reject(…);
you could just do throw …;
.
这篇关于有没有办法提前退还延期承诺?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!