2016-12-05 12 views
1

私はNodeを初めて使用しており、forループのデータを追加しようとしていますが、Nodeの非同期性の問題を抱えています。 faceAPI機能プリントでforループの後のNode.jsコールバック

function emotionsAPI(data, next){ 
    for(var url in data) { 
     if(data.hasOwnProperty(url)) { 
      request({ 
      method: 'POST', 
      url: 'https://api.projectoxford.ai/emotion/v1.0/recognize', 
      headers: { 
       "Content-Type": 'application/json', 
       "Ocp-Apim-Subscription-Key": keys.emotion_key 
      }, 
      body: "{\"url\" : \"" + url + "\"}" 
      }, function (error, response, body){ 
       var emotions = JSON.parse(body) 
       if (emotions.length > 0){ 
        var scores = emotions[0].scores; 
        console.log("scores found"); 
        console.log(scores.anger); 
        data[url].anger = scores.anger; 
       } 
      }) 
     } 
    } 
    next(data); 
} 

function faceAPI(data){ 
    console.log("HELP"); 
    console.log(data); 
} 

emotionsAPI(data, faceAPI); 

にconsole.logコンソールに正しくなく、forループが作られている必要があることを、変更を反映するものではありません。私はasync.forEachOfを使ってみましたが、コンソールは永久にハングアップしているようでした。

+0

非同期メソッドでデータを変更しようとしています。彼らは別の方法で。たぶんurl要求のコールバックメソッドの中に "next(data)"メソッドを置くべきでしょう。 –

答えて

0

私はあなたに試行の呼び出しurl要求を同期的な方法と信じていますが、結果は非同期では分かりません。

私はこのライブラリはあなたのために良いことができると信じて:async

また、あなたは再帰的なスタイルとして、あなたの方法を書くことができます。しかし、これは良い習慣ではありません。このメソッドを一度に呼び出すように変更してから、コールバックポストメソッド内でfaceAPI(data)メソッドを渡す必要があります。

0

forルックの1回の反復が行われます。コールバックが解決されるまで待ちません。したがって、forloopを終了し、いずれかの要求が完了する前にnext関数に戻ることがあります。

呼び出しがうまくいっていれば、再帰関数に配置し、前の呼び出しが完了した後に次の要求を行うことができます。

var arr = Object.keys(data); // store the key names in an array 

emotionsAPI(0, data, faceAPI) 

function emotionsAPI(data, index, next) { 
    if(index < arr.length) { 
    request({ 
     method: 'POST', 
     url: 'https://api.projectoxford.ai/emotion/v1.0/recognize', 
     headers: { 
     "Content-Type": 'application/json', 
     "Ocp-Apim-Subscription-Key": keys.emotion_key 
     }, 
     body: "{\"url\" : \"" + url + "\"}" 
    }, function (error, response, body){ 
     var emotions = JSON.parse(body) 
     if (emotions.length > 0){ 
     var scores = emotions[0].scores; 
     console.log("scores found"); 
     console.log(scores.anger); 
     data[arr[index]].anger = scores.anger; 
     } 
     emotionsAPI(data, ++index, next); 
    }) 
    } else { 
    next(data); 
    } 
} 

そうしないと、要求はまだ私はPromisesに探してお勧めします同時に行うことがしたい場合。具体的にはPromise.all

関連する問題