有没有办法在延期承诺中提前返回

Is there a way to return early in deferred promise?

本文关键字:返回 承诺 有没有      更新时间:2023-09-26

所以我有一个包含多个检查的承诺,比如这个

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代码,控制流的每个分支都有一个promise。您可以使用Q.rejectQ.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.fbind中,这样就可以不编写return Q.reject(…);,而只编写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
}

我认为这是最好的方式,感谢Bergi