使用promise来编写可读代码的最佳方法是什么?

我有一些node.js的承诺代码看起来像这样:

function myFunc(data) { Q(data).then(function(data) { return getPromise1(globalVar).then(function(res1a) { return getPromise2(JSON.parse(param2)).then(function(res2a) { return doStuff(); }).then(function(res2b) { return getPromise3(data).then(function(res3a) { return getPromise4.then(function(res4a) { // more stuff }) }) }) }) }) }) 

正如你所看到的,这段代码不太可读。 有一个更好的方法吗?

除了从控制stream参数中分离数据参数之外,承诺的目标之一实际上是解决这个巨大的三angular形代码块的问题。

 function myFunc(data) { Q(data).then(function(data) { return getPromise1(globalVar); }).then(function(res1a) { return getPromise2(JSON.parse(param2)); }).then(function(res2a) { return doStuff(); }).then(function(res2b) { return getPromise3(data); }).then(function(res3a) { return getPromise4; }).then(function(res4a) { // more stuff }) } 

现在,你将需要嵌套一个承诺的唯一原因是,如果你需要使用函数中的承诺返回的数据,而不是紧接着它。 见下文:

 doAsyncA().then(function(x) { doAsyncB().then(function(y) { doSyncUsingBothReturns(x, y); }) }) 

如果你一次不需要所有的结果,只要停止处理callback这样的承诺:

 function myFunc(data) { Q(data).then(function(data) { return getPromise1(globalVar); }).then(function(res1a) { return getPromise2(JSON.parse(param2)); }).then(function(res2a) { return doStuff(); }).then(function(res2b) { return getPromise3(data); }).then(function(res3a) { return getPromise4; }).then(function(res4a) { // more stuff }) }) 

如果你这样做,那么你可以尝试支持生成器函数的协程 (Q可能有一些东西,但这是蓝鸟的方式):

 var myFunc = bluebird.coroutine(function* myFunc(data) { var res1a = yield getPromise1(globalVar); var res2a = yield getPromise2(JSON.parse(param2)); var res2b = yield doStuff(); var res3a = yield getPromise3(data); var res4a = yield getPromise4; // more stuff }) 

或同步检查 :

 function myFunc(data) { var res1a = getPromise1(globalVar); var res2a = res1a.then(function() { yield getPromise2(JSON.parse(param2)); }); var res2b = res2a.then(function() { // feel free to use res1a.value() here; // you know that it has to have been resolved doStuff(); }); // … return res4a; } 

在你的例子中,它将有助于使用lambdaexpression式:

Q(data) .then(data => getPromise1(globalVar) .then(re1a => getPromise2(JSON.parse(param2)

等等。 没有嵌套和在这种风格,它看起来不像callback地狱:)