Javascript for循环后的Node.js回调
我对Node还不熟悉,试图在API调用的for循环中追加数据,但由于Node的异步特性,我遇到了一些挑战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/
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请求的回调方法中。