给出以下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,所以需要确定groupID
和groupObject
变量的范围。
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/