我正在尝试了解如何等待http请求在节点中完成。我想发出两个http请求,并在 http请求完成后,在一个名为的函数中使用结果。
我正在使用异步和请求,并且一直在使用async.series,如下所示:
var request = require("request");
var express = require('express');
var async = require("async");
app.get('/rx', function(req, res) {
var drug1 = req.query.drug1;
var drug2 = req.query.drug2;
console.log("in rx")
console.log(drug1);
console.log(drug2);
var id1 = '';
var id2 = '';
/*part of code I'm concerned with*/
async.series([
function(callback) {
id1 = getID(drug1);
console.log("function one");
console.log(id1);
callback();
},
function(callback) {
id2 = getID(drug2);
console.log("function two");
console.log(id2);
callback();
}
],
function(err, results) {
console.log(id1);
console.log(id2);
request("http://rxnav.nlm.nih.gov/REST/interaction/interaction.json?list?rxcuis=" + id1 + "&sources=" + id2, function(error, response, body) {
console.log("finished!");
res.json(body);
});
});
});
//returns an int ID
function getID(drugName) {
request("http://rxnav.nlm.nih.gov/REST/Prescribe/rxcui.json?name=" + drugName, function(error, response, body) {
var content = JSON.parse(body);
var id = parseInt(content.idGroup.rxnormId);
console.log("in getID function");
console.log(id);
return id;
});
}
控制台输出显示:
in rx
advil
ibuprofen
seriesone
undefined
two
undefined
undefined
undefined
finished!
GET /rx?drug1=advil&drug2=ibuprofen 304 345ms
in getID function
153010
in getID function
5640
我想等到每个http请求函数完成,然后继续下一部分代码。我如何实现这一目标?
答案 0 :(得分:1)
这个问题(或其变体)在StackOverflow上被问过1000多次。因此,我不打算解释它,但你可以搜索"返回async"如果您想了解更多信息,请访问此网站(右上角的搜索输入)。
基本问题是从异步函数返回值是不可能的(不知道为什么它们会接受回调?)。
针对您的具体情况,您需要将getId()
更改为:
//returns an int ID
function getID(drugName, callback) {
request("http://rxnav.nlm.nih.gov/REST/Prescribe/rxcui.json?name=" + drugName, function(error, response, body) {
var content = JSON.parse(body);
var id = parseInt(content.idGroup.rxnormId);
console.log("in getID function");
console.log(id);
callback(null,id); // <--- this is how you return async values
});
}
注意:null
是因为async.js系列中的函数要求回调的第一个参数是错误的。因此,如果没有错误通过null
。顺便说一下,这是一个标准的node.js实践。
然后在async.series()
内进行:
async.series([
function(callback) {
getID(drug1,callback);
},
function(callback) {
getID(drug2,callback);
}
],
function(err, results) {
console.log(results[0]); // id1
console.log(results[1]); // id2
// do the rest..
});