等待所有CallBacks在没有静态时间的情况下完成执行

时间:2018-01-11 04:37:15

标签: javascript node.js asynchronous coffeescript

我最近一直在使用快速应用程序,而且我一直在使用CoffeeScript使JS更具可忍性。我有一个类似于以下的结构:

items = []
for region in regions
    expensive_function {}, (err, data) ->
        # operations on data/error handling
        items.push({k: data['v'][a]['l']}) # transforming information from data
return items

在返回之后,items数组总是空出来,由于正常的NodeJS异步,我感觉可能是竞争条件。

我需要遍历regions数组中的所有项目,并在返回之前从该昂贵的函数中获取数据。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您可以将expensive_function转换为承诺返回函数,并使用async / await:

expensive_function_promise = (obj) ->
  return new Promise (resolve, reject) ->
    expensive_function obj, (err, data) ->
      reject(err) if err?
      resolve data

create_items = (regions) ->
  items = []
  for region in regions
    data = await expensive_function_promise {}
    items.push { k: data.v[a].l }
  items

create_items regions
  .then (items) ->
    do_something_with items
  .catch (err) ->
    handle_error err