有没有办法在延迟承诺中提前返回? [英] Is there a way to return early in deferred promise?

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

问题描述

所以我有一个承诺,其中包含多个这样的检查

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"中的 return 可以使代码看起来更好的东西?例如像这样:

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?

推荐答案

尽量不要创建单个 deferred,它可能会被函数的多个部分拒绝,并且需要在每个退出点返回.
取而代之的是,使用单独的 Promise 进行编码,每个控制流分支对应一个.您可以使用 Q.rejectQ.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);
    });
}

或者,您可以将 test 函数封装在 Q.fbind,这样你就可以不用写 return 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天全站免登陆