Node.js |循环数组,进行post调用并在数组中累积结果

时间:2012-10-18 04:48:13

标签: javascript node.js callback coffeescript

我想在Node.js中调用这样的东西(我使用coffeescript作为node.js)

test = [] //initially an empty array
list = []//an array with 10 json object

for li in list
  get_data url , li, (err,data) -> test.push data

我的get_data方法看起来像

get_data: (url, json_data, callback) ->
  throw "JSON obj is required" unless _.isObject(json_data) 
  post_callback = (error, response) ->
    if error
      callback(error)
    else
      callback(undefined, response)
    return
  request.post {url: url, json: json_data}, post_callback
  return

问题是我无法将request.post的结果收集到'test'数组中 我知道我在for循环中做错了但不确定是什么

2 个答案:

答案 0 :(得分:1)

您似乎无法知道所有请求何时返回。你应该考虑使用a good async library,但是你可以这样做:

test = [] //initially an empty array
list = []//an array with 10 json object

on_complete = ->
  //here, test should be full
  console.log test
  return

remaining = list.length
for li in list
  get_data url , li, (err,data) ->
    remaining--
    test.push data
    if remaining == 0
      on_complete()

答案 1 :(得分:0)

只是看着你的代码(没有尝试过),问题似乎是“当你得到答案时”,而不是“如果你得到答案”的问题。在for循环运行之后,您所做的就是排队一堆请求。您需要设计它,以便第一个请求不会发生,直到第一个响应或者(更好)您需要一种方法来累积响应并知道所有响应何时返回(或超时)并且然后使用不同的回调将控制权返回给程序的主要部分。

BTW,here是我为ActionScript创建的多文件加载器的代码。由于I / O在ActionScript中也是异步的,因此它实现了我在上面描述的累积方法。它使用事件而不是回调,但它可能会给你一些关于如何为CoffeeScript实现它的想法。