给出以下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循环的下一个循环。

您将如何以适当的方式做到这一点?

最佳答案

您只需要按顺序进行对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循环不受限制地进行迭代,但是promise实际上是按顺序解决的。

但是,我鼓励您使用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

关于node.js - 封锁直到 promise 解决,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27373540/

10-16 20:04