我想使用NodeJS从2个网址获取响应,并将它们放在一个数组中供以后处理。
我无法将body / resp存储在request.get函数之外。 Resp在request.get之外有undefined
个。
有什么建议我做错了吗? THX
var msurls = ["http://example.org/get1", "http://example.org/get2"];
var request = require("request");
var msresult = [];
msurls.forEach(function(msurl) {
var resp;
request.get(msurl,function(error,response,body){
if(error) {
console.log(error);
} else {
resp = body;
}
});
msresult.push(resp);
});
console.log(msresult);
答案 0 :(得分:0)
您的代码时间存在问题。在您msresult.push(resp);
完成之前,request.get
已被解雇,因此您推送的resp
尚无值。
我想你可以使用等待......(我可能错了)
var msurls = ["http://example.org/get1", "http://example.org/get2"];
var request = require("request");
var msresult = [];
msurls.forEach(function(msurl) {
await request.get(msurl, function(error, response, body){
if(error) {
console.log(error);
} else {
msresult.push(body);
}
});
});
console.log(msresult);
答案 1 :(得分:0)
查看Promise.all() - 它允许您执行多个异步请求。
清洁解决方案将是:
const request = require("request");
const getData = async (requests) => {
return Promise.all(requests);
};
const doWork = async () => {
const msurls = ["http://example.org/get1", "http://example.org/get2"];
const requests = msurls.map(url => request.get(url));
const result = await getData(requests);
console.log(result);
return result;
};
至于进一步学习,请查看Node支持的ES6功能,并阅读Javascript中的异步编程。
答案 2 :(得分:0)
request
模块不支持promises,而是使用request-promise-native
,否则,你必须使用@Gediminas写的回调。
我更喜欢这种更干净的解决方案,这是更现代的javascript:
let msurls = ["http://example.org", "http://example.org"]
let request = require("request-promise-native")
async function doRequests() {
return await(Promise.all(
msurls.map(async msurl => await request(msurl)))
)
}
doRequests().then(msresult => console.log(msresult))
您已经有一个包含结果的数组,代码看起来是同步的。