Javascript for循环后的Node.js回调

Javascript for循环后的Node.js回调,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我对Node还不熟悉,试图在API调用的for循环中追加数据,但由于Node的异步特性,我遇到了一些挑战 function emotionsAPI(data, next){ for(var url in data) { if(data.hasOwnProperty(url)) { request({ method: 'POST', url: 'https://api.projectoxford.ai/

我对Node还不熟悉,试图在API调用的for循环中追加数据,但由于Node的异步特性,我遇到了一些挑战

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);

faceAPI函数中的console.log正确地打印到控制台,但不反映for循环应该进行的更改。我尝试使用async.forEachOf,但控制台似乎永远挂起。

我相信您可以尝试以同步方式调用url请求,但正如您所述,结果在异步方式下有效

我相信这个图书馆对你有好处:


此外,还可以将方法编写为递归样式。但这不是一个好的做法。您应该将此方法更改为立即被调用,然后在callback post方法中传递
faceAPI(data)
方法。

我相信您可以尝试以同步方式调用url请求,但正如您所述,结果是异步的

我相信这个图书馆对你有好处:


此外,还可以将方法编写为递归样式。但这不是一个好的做法。您应该将此方法更改为立即被调用,然后将
faceAPI(data)
方法传递到callback post方法中。

for look的一次迭代开始,它不会等到回调解析后再开始下一次。因此,可能在任何请求完成之前完成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);
  }
}
var arr=Object.keys(数据);//将密钥名称存储在数组中
emotionsAPI(0,数据,faceAPI)
函数emotionsAPI(数据、索引、下一步){
if(索引0){
var分数=情绪[0]。分数;
控制台日志(“找到的分数”);
console.log(分数、愤怒);
数据[arr[指数]].anger=得分.anger;
}
emotionsAPI(数据+索引,下一步);
})
}否则{
下一步(数据);
}
}

否则,如果您希望仍然同时提出请求,我建议您进行调查。具体来说。

for look的一次迭代进行时,它不会等到回调被解析后才开始下一次。因此,可能在任何请求完成之前完成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);
  }
}
var arr=Object.keys(数据);//将密钥名称存储在数组中
emotionsAPI(0,数据,faceAPI)
函数emotionsAPI(数据、索引、下一步){
if(索引0){
var分数=情绪[0]。分数;
控制台日志(“找到的分数”);
console.log(分数、愤怒);
数据[arr[指数]].anger=得分.anger;
}
emotionsAPI(数据+索引,下一步);
})
}否则{
下一步(数据);
}
}

否则,如果您希望仍然同时提出请求,我建议您进行调查。具体来说。

您正试图用异步方法更改数据。他们以不同的方式进行了讨论。也许你应该把“next(data)”方法放在url请求的回调方法中。你正在尝试用异步方法更改数据。他们以不同的方式进行了讨论。也许您应该将“next(data)”方法放在url请求的回调方法中。