我怎样才能正确使用promises,这样我的代码就不会如此嵌套?

时间:2015-11-27 22:42:28

标签: javascript coffeescript promise bluebird

这是我的代码。它继续非常嵌套。如果重要,我正在使用bluebird

Promise.each BrowseNodes, (BrowseNode) ->
  amazonClient.browseNodeLookup
    browseNodeId: BrowseNode.browseNodeId
  .then (lookupResult) ->
    childNodes = lookupResult[0].Children[0].BrowseNode
    Promise.each childNodes, (childNode) ->
      amazonClient.browseNodeLookup
        browseNodeId: childNode.BrowseNodeId
        responseGroup: 'TopSellers'
      .then (results) ->
        items = results[0].TopSellers[0].TopSeller

1 个答案:

答案 0 :(得分:1)

一般来说,为了摆脱这种瀑布效应,你可以改变这样的东西:

asyncService.doSomething()
.then(function(res) {
  asyncService.doSomethingElse(res)
  .then(function(secondRes) {
    asyncService.doAThirdThing(secondRes)
    .then(function(thirdRes) {
      // continue
    });
  });
});

到此:

asyncService.doSomething()
.then(function(res) {
  return res;
})
.then(function(res) {
  return asyncService.doSomethingElse(res);
})
.then(function(secondRes) {
  return asyncService.doAThirdThing(secondRes);
})
.then(function(thirdRes) {
  // etc.
});

此解决方案有效,因为Promise方法会自己返回promise。

这只是一个语法实现细节,但代码也做同样的事情。

如果您正在使用ES6和CoffeeScript,请尝试使用co之类的库来利用同步异步代码(通过使用生成器)。

您也可以使用promise-waterfall之类的内容,或查看是否有可用于即将推出的ES7异步/等待的回填库。

修改

处理Promise.each

.then(function() {
  return Promise.each(/* do stuff */);
})
.then(function(result) {
  // do stuff
});