0

I've been working an express application recently and I've been using CoffeeScript to make the JS a bit more bearable. I have a structure similar to the following:

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

The items array invariably comes out empty after that return, which I have a feeling may be a race condition due to the normal NodeJS async.

I need to go through all items in the regions array and getting the data from that expensive function before I can return.

Any suggestions?

Mark
  • 694
  • 5
  • 15

1 Answers1

1

You can turn the expensive_function into a promise returning function, and use 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
elclanrs
  • 92,861
  • 21
  • 134
  • 171