Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 有没有办法在延期承诺中提前返回?_Javascript_Promise_Q - Fatal编程技术网

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

Javascript 有没有办法在延期承诺中提前返回?,javascript,promise,q,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")

因此,我有一个承诺,其中包含像这样的多张支票

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

尽量不要创建一个延迟,它可能会被函数的多个部分拒绝,并且需要在每个退出点返回。
相反,使用单独的承诺编写代码,每个承诺对应于控制流的每个分支。您可以使用和-避免不推荐的延迟模式。然后,您的函数将如下所示:

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.reject(…)你可以做

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

为什么不使用
如果(通过)
继续,然后在函数的最后,您可以进行一次测试,看看是否应该拒绝。在每种情况下,您都可以返回deferred.promise,而不是只返回。但是这会很混乱。函数需要首先返回一个承诺,因此它首先返回一个承诺,然后拒绝它。您不能执行
return delferred.reject()
,因为它不返回承诺,并且会抛出错误。这样做可以避免金字塔。但是您可以简单地
deferred.reject();回报。承诺(如果您不想使用我的答案中更简单的版本)。不需要异步回调。