鉴于以下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
- 循环的下一次迭代,直到前一个的承诺得到解决。
你会如何以正确的方式做到这一点?
答案 0 :(得分:0)
您只需按顺序拨打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
循环没有限制地迭代,但承诺实际上是按顺序解析的。
但是,我建议您使用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