在某些情况下,当我从promise对象获得返回值时,我需要then()根据值的条件来启动两个不同的进程,例如:
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().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都可以。
then
那么,处理它的最佳实践是什么?
只要您的函数返回承诺,就可以使用建议的第一种方法。
下面的小提琴显示了如何根据第一个解析的值采用不同的链接路径。
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 });