1

このようなNode.jsで呼び出しを行いたいです(node.jsにcoffeescriptを使用しています)

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' 配列 に収集できないことです

4

2 に答える 2

1

すべてのリクエストがいつ返されたかを知る方法がないようです。優れた非同期ライブラリの使用を検討する必要がありますが、その方法は次のとおりです。

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()
于 2012-10-18T16:05:46.667 に答える
0

コードを見るだけで (試してみるのではなく)、問題は「応答を受け取るかどうか」の問題ではなく、「いつ応答を受け取るか」の問題のようです。for ループの実行後は、一連のリクエストをキューに入れるだけです。最初の応答が応答するまで 2 番目の要求が発生しないように設計するか、または (より良い) 応答を蓄積し、すべての応答がいつ戻ってきたか (またはタイムアウトしたか) を知る方法が必要です。次に、別のコールバックを使用して、制御をプログラムの主要部分に戻します。

ところで、これは私が ActionScript 用に作成したマルチファイル ローダーのコードです。I/O は ActionScript でも非同期であるため、上記で説明した累積アプローチを実装します。コールバックではなくイベントを使用しますが、これを CoffeeScript に実装する方法についていくつかのアイデアが得られるかもしれません。

于 2012-10-18T07:39:19.697 に答える