简体   繁体   English

有没有办法提前兑现延期承诺?

[英]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
}

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? 我想知道是否有类似“ q”中的return的代码可以使代码看起来更好? 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
}

This definitely doesn't work because it returned before promise is returned, but I'm wondering is there something like a return? 这绝对是行不通的,因为它在承诺返回之前就返回了,但是我想知道是否有类似返回的东西?

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. 取而代之的是使用单独的Promise,每个控制流分支都有一个Promise。 You can use Q.reject and the Q.Promise constructor - avoid the deprecated deferred pattern. 您可以使用Q.rejectQ.Promise构造函数 -避免使用不建议使用的延迟模式。 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);
    });
}

Alternatively, you can wrap your test function in Q.fbind , so that instead of writing return Q.reject(…); 另外,您可以将test函数包装在Q.fbind ,这样就不必编写return Q.reject(…); you could just do throw …; 你可以throw …; .

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
}

I think this is the best way, thank to Bergi 我认为这是最好的方法,感谢贝尔吉

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM