有没有办法提前退还延期承诺? [英] Is there a way to return early in deferred promise?

查看:134
本文介绍了有没有办法提前退还延期承诺?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以我有一个包含多个这样的支票的承诺

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆