有没有办法提前退还延期承诺?

时间:2015-08-11 05:10:14

标签: javascript promise q

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

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'中的返回可以使代码看起来更好吗?例如:

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之前返回,但我想知道是否有类似返回的内容?

2 个答案:

答案 0 :(得分:1)

尽量不要创建单个延迟,可以从函数的多个部分中拒绝,并且在每个出口点都需要返回。 相反,代码具有单独的promise,一个用于控制流的每个分支。您可以使用Q.rejectQ.Promise constructor - 避免使用已弃用的延迟模式。您的功能将如下所示:

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 …;

答案 1 :(得分:0)

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