阻止,直到承诺得到解决

时间:2014-12-09 07:28:58

标签: node.js coffeescript q

鉴于以下Coffeescript代码:

for groupID, groupObj of @cache.groups

  #do some other stuff

  #calling this function which is returning a promise
  @callcounter.findNumbers(groupID)
  .then (result) =>
    @cache.groups[groupID].someValue = result.someValue

在幕后,方法findNumbers正在查询SQL数据库(使用繁琐,不支持并发查询)并返回一个promise(库:Q)

因此,代码执行不应进入for - 循环的下一次迭代,直到前一个的承诺得到解决。

你会如何以正确的方式做到这一点?

1 个答案:

答案 0 :(得分:0)

您只需按顺序拨打findNumbers,对吗?你只需要兑现你的承诺。

重要提示:因为您使用的是命令式循环,而不是[] .forEach,因此您需要确定groupIDgroupObject变量的范围。

globalPromise = null

createScopedPromiseFn = (groupID, groupObject) =>
  return ->
    @callcounter.findNumbers(groupID).then (result) =>
       @cache.groups[groupID].someValue = result.someValue

for groupID, groupObj of @cache.groups
  createPromise = createScopedPromiseFn groupID, groupObj
  # The if here is for initialisation
  globalPromise = if globalPromise then globalPromise.then createPromise() else createPromise()

globalPromise.then ->
  # Here you have finished

在这段代码中,for循环没有限制地迭代,但承诺实际上是按顺序解析的。

但是,我建议您使用reduce代替功能性方法:

createScopedPromise = (groupIndex, group) =>
  @callcounter.findNumbers(groupIndex).then (result) =>
    @cache.groups[groupIndex].someValue = result.someValue

globalPromise = @cache.groups.reduce (promise, group, index) ->
  if promise
    return promise.then ->
      createScopedPromise index, group
  else # First promise
    return createScopedPromise index, group

globalPromise.then ->
  # Here you have finished