当前位置: 首页 > 知识库问答 >
问题:

那么如何处理promise中的if-else呢?

陶鹏
2023-03-14

在某些情况下,当我从一个promise对象得到一个返回值时,我需要启动两个不同的,然后()过程取决于值的条件,比如:

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();
    }
})

但我有两个问题:

>

如果我需要两个进程在最后调用一个函数呢?这意味着他们有相同的“终端”

我试图回报新的promise,保持原来的链条,如:

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

但是在这种情况下,无论是真是假,下一个然后都会起作用。

那么,处理它的最佳做法是什么?


共有3个答案

谷梁浩思
2023-03-14

这就是我在fetch中所做的()我不确定这是否是正确的方法,但它是有效的

 fetch().then(res => res.ok ? res : false).then(res => {
    if (res) {
        //res ok
    } else {
       //res not ok
    }

});
薛寒
2023-03-14

我已经为条件promise用法编写了一个简单的包。

如果你想看看:

npm页面:https://www.npmjs.com/package/promise-tree

和github:https://github.com/shizongli94/promise-tree

对于询问一揽子计划如何解决问题的评论:

1、它有两个对象。

2,此包中的Branch对象是要在then()或catch()中使用的onCompleted和onRejected等函数的临时存储位置。它有一些方法,如then()和catch(),它们采用与Promise中的对应参数相同的参数。在Branch.then()或Branch.catch()中传入回调时,请使用与Promise.then()和Promise.catch()相同的语法。然后,只需将回调存储在数组中。

3、Condition是一个JSON对象,它存储用于检查和分支的条件和其他信息。

4、在promise回调中使用条件对象指定条件(布尔表达式)。条件然后存储您传递的信息。在用户提供了所有必要的信息之后,条件对象使用一种方法来构造全新的Promise对象,该对象使用先前存储在分支对象中的promise链和回调信息。这里有一个小棘手的部分是,您(作为实现者,而不是用户)必须在链接存储的回调之前解决/拒绝您首先手动构建的Promise。这是因为否则,新的promise链将无法启动。

5,多亏了事件循环,分支对象可以在您拥有一个stem Promise对象之前或之后实例化,它们不会相互干扰。我在这里使用“树枝”和“茎”这两个术语,因为它的结构类似于一棵树。

示例代码可以在npm和github页面上找到。

顺便说一下,此实现还允许您在分支中拥有分支。分支机构不必位于检查条件的同一位置。

李谦
2023-03-14

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

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

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) {

});
 类似资料:
  • 问题内容: 在某些情况下,当我从promise对象获得返回值时,我需要根据值的条件来启动两个不同的进程,例如: 我在想也许我可以这样写: 但是有了这个,我有两个问题: 我不确定开始一个新的承诺是否是个好主意,然后在承诺中进行流程; 如果我需要两个进程在最后一个函数中调用怎么办?这意味着它们具有相同的“终端” 我试图返回新的承诺,以保持原始链像: 但是在这种情况下,无论是对还是错,下一个都可以。 那

  • Perl条件语句有助于决策,这需要程序员指定一个或多个要由程序评估或测试的条件,以及在条件被确定为真时要执行的一个或多个语句,以及可选的其他条件如果确定条件为假,则执行语句。 以下是大多数编程语言中的典型决策结构的一般性 - 数字0,字符串'0'和“”,空列表()和undef在布尔上下文中都是false ,所有其他值都为true 。 否定真正的价值! 或not返回特殊的假值。 Perl编程语言提供

  • 本文向大家介绍C# if, if...else, if... else if ,包括了C# if, if...else, if... else if 的使用技巧和注意事项,需要的朋友参考一下 示例 该if语句用于控制程序的流程。一条if语句根据Boolean表达式的值标识要运行的语句。 对于单个语句,braces{}是可选的,但建议使用。 该if还可以有一个else条款,将在案件条件的计算结果来执

  • 我们的组织有一个必需的编码规则(没有任何解释),即: if...else if构造应该用else子句终止 示例1:

  • if语句之后可以跟一个可选的else if...else语句,这对于使用单个if ... else if语句测试各种条件非常有用。 当使用if...else if…else语句时,请记住 - 一个if可以有零个或一个else语句,它必须在任何其他if之后。 如果语句可以有零到多个if,它们必须在else之前。 一旦else if成功,其余的if或else语句都不会被测试。 if ... else

  • 问题内容: Python 2.7+中是否存在一种进行以下操作的方法? 我知道您只要使用’if’就可以做任何事情: 问题答案: 您已经知道了:是有效的Python表达式。所示的dict理解的唯一问题是dict理解中表达式的位置必须有两个表达式,并用冒号分隔: final子句充当过滤器,这与具有条件表达式不同。