一尘不染

那么如何处理if-else中的诺言?

node.js

在某些情况下,当我从promise对象获得返回值时,我需要then()根据值的条件来启动两个不同的进程,例如:

promise().then(function(value){
    if(//true) {
        // do something
    } else {
        // do something 
    }
})

我在想也许我可以这样写:

promise().then(function(value){
    if(//true) {
        // call a new function which will return a new promise object
        ifTruePromise().then();
    } else {
        ifFalsePromise().then();
    }
})

但是有了这个,我有两个问题:

  1. 我不确定开始一个新的承诺是否是个好主意,然后在承诺中进行流程;

  2. 如果我需要两个进程在最后一个函数中调用怎么办?这意味着它们具有相同的“终端”

我试图返回新的承诺,以保持原始链像:

promise().then(function(value){
    if(//true) {
        // call a new function which will return a new promise object
        // and return it
        return ifTruePromise();
    } else {
        // do something, no new promise
        // hope to stop the then chain
    }
}).then(// I can handle the result of ifTruePromise here now);

但是在这种情况下,无论是对还是错,下一个then都可以。

那么,处理它的最佳实践是什么?


阅读 231

收藏
2020-07-07

共1个答案

一尘不染

只要您的函数返回承诺,就可以使用建议的第一种方法。

下面的小提琴显示了如何根据第一个解析的值采用不同的链接路径。

function myPromiseFunction() {

    //Change the resolved value to take a different path

    return Promise.resolve(true);

}



function conditionalChaining(value) {

    if (value) {

        //do something

        return doSomething().then(doSomethingMore).then(doEvenSomethingMore);

    } else {

        //do something else

        return doSomeOtherThing().then(doSomethingMore).then(doEvenSomethingMore);

    }

}



function doSomething() {

    console.log("Inside doSomething function");

    return Promise.resolve("This message comes from doSomeThing function");

}



function doSomeOtherThing() {

    console.log("Inside doSomeOtherthing function");

    return Promise.resolve("This message comes from doSomeOtherThing function");

}



function doSomethingMore(message) {

    console.log(message);

    return Promise.resolve("Leaving doSomethingMore");

}



function doEvenSomethingMore(message) {

    console.log("Inside doEvenSomethingMore function");

    return Promise.resolve();

}



myPromiseFunction().then(conditionalChaining).then(function () {

    console.log("All done!");

}).

catch (function (e) {



});

您也可以只进行一个条件链接,将返回承诺分配给变量,然后继续执行应以任何一种方式运行的功能。

function conditionalChaining(value){
    if (value) {
        //do something
        return doSomething();
    } else{
        //do something else
        return doSomeOtherThing();
    }
}

var promise = myPromiseFunction().then(conditionalChaining);

promise.then(function(value){
    //keep executing functions that should be called either way
});
2020-07-07