如何处理节点http请求
How to handle node http requests
我正在尝试了解如何在节点中等待 http 请求完成。我想发出两个 http 请求并在 在 http 请求完成后调用的函数中使用结果。
我正在使用 async 和 request 并且一直在使用 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请求函数完成后,再进行下一段代码。我该如何实现?
此问题(或其变体)已在 Whosebug 上被问过 1000 多次。所以我不打算解释它,但如果你想了解更多,你可以在这个网站上搜索"return async"(右上角的搜索输入)。
基本问题是不可能 return 来自异步函数的值(有没有想过为什么他们接受回调?)。
对于您的具体情况,您需要将 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..
});
我正在尝试了解如何在节点中等待 http 请求完成。我想发出两个 http 请求并在 在 http 请求完成后调用的函数中使用结果。
我正在使用 async 和 request 并且一直在使用 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请求函数完成后,再进行下一段代码。我该如何实现?
此问题(或其变体)已在 Whosebug 上被问过 1000 多次。所以我不打算解释它,但如果你想了解更多,你可以在这个网站上搜索"return async"(右上角的搜索输入)。
基本问题是不可能 return 来自异步函数的值(有没有想过为什么他们接受回调?)。
对于您的具体情况,您需要将 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..
});