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

Posted

技术标签:

【中文标题】那么如何处理 if-else in promise 呢?【英文标题】:How to handle the if-else in promise then? 【发布时间】:2016-01-20 08:06:49 【问题描述】:

在某些情况下,当我从 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();
    
)

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

    我不确定在一个 Promise 中启动一个新的 Promise-then 流程是否是个好主意;

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

我试图返回新的承诺以保留原始链,例如:

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都会起作用。

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

【问题讨论】:

这就是你要找的东西***.com/questions/26599798/… ? 【参考方案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
);

【讨论】:

【参考方案2】:

我为使用条件承诺编写了一个简单的包。

如果你想看看:

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

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

响应 cmets 询问软件包如何解决问题:

1,它有两个对象。

2、这个包中的Branch对象是一个临时存放的地方,用于存放你想在then()或catch()中使用的onFulfilled和onRejected等函数。它具有诸如 then() 和 catch() 之类的方法,它们采用与 Promise 中的对应物相同的参数。在 Branch.then() 或 Branch.catch() 中传入回调时,使用与 Promise.then() 和 Promise.catch() 相同的语法。然后什么都不做,只将回调存储在一个数组中。

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

4,您在承诺回调中使用条件对象指定条件(布尔表达式)。然后 Condition 存储您传入的信息。在用户提供所有必要信息后,condition 对象使用一种方法构造全新的 Promise 对象,该对象采用先前存储在 Branch 对象中的 Promise 链和回调信息。这里有点棘手的部分是您(作为实施者,而不是用户)必须在链接存储的回调之前解析/拒绝您首先手动构建的 Promise。这是因为否则,新的承诺链将不会启动。

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

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

顺便说一下,这个实现还可以让你在一个分支中拥有分支。并且分支不必在您检查条件的同一个地方。

【讨论】:

看起来您提供的是 cmets 而不是答案。一旦你有足够的reputation,你就可以在任何帖子上comment。还要检查这个what can I do instead。 @thewaywewere,我已根据您的要求添加了实施细节。【参考方案3】:

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

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

);

【讨论】:

以上是关于那么如何处理 if-else in promise 呢?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理浏览器的断网情况?

逻辑“和”运算符如何处理整数? [复制]

如何处理返回没有行的 IN 子句的子查询

字符串类型数组的指针运算,C++如何处理这个?

Pyaudio回调模式下如何处理in_data?

突如其来的“中断异常”,我(Java)该如何处理?