使用promises的更平坦的调用:避免回调

时间:2014-12-05 18:50:03

标签: javascript coffeescript promise bluebird

我在使用promises时发现了以下用例。我正在编写CoffeeScript以获得简洁,但JavaScript开发人员的阅读应该是直截了当的

getUserName().then (userName) ->
  getRelatedCompany(userName).then (relatedCompany) ->
    registerConnexion(userName, relatedCompany)

在上面的所有请求都取决于前面的结果。解决这个问题的正确方法是什么:

getUserName().then (userName) ->
  getRelatedCompany(userName)
.then (relatedCompany) ->
  # in that example, userName would be undefined here but there's less callbackception
  registerConnexion(userName, relatedCompany) 

编辑:我使用bluebird作为承诺库。

1 个答案:

答案 0 :(得分:1)

您可以将promises用作代表值的代理:

username = getUserName()
company = username.then(getRelatedCompany)
// assuming good promise lib, otherwise shim .spread of nest once
connexion = Promise.all([username, company]).spread(registerConnexion) 

在蓝鸟中,这更简单,变成:

username = getUserName()
company = username.then(getRelatedCompany)
connexion = Promise.join(username, company, registerConnexion);

因为.join是为此用例而设计的。