那么如何处理 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 呢?的主要内容,如果未能解决你的问题,请参考以下文章