Node JS:如何从不同的网站请求多个源代码?
Node JS: How do I request multiple source codes from different websites?
我遇到一个问题,如果我多次尝试使用请求,它就不起作用。我可以举个例子:
request('https://www.google.com', function (error, response, vBody1) {
request('https://www.purple.com', function (error, response, vBody2) {
request('https://www.whosebug.com', function (error, response, vBody3) {
console.log(vBody3);
});
console.log(vBody2);
});
console.log(vBody1);
});
它读取并输出第一个站点的正文,但不读取接下来的两个。
这是另一个例子:
vSites = ['https://www.google.com','https://www.purple.com','https://www.whosebug.com'];
for (i = 0; i < vSites.length; i++){
request(vSites[i], function (error, response, vBody[i]) {
console.log(vBody[i]);
});
}
这个看起来更干净,我想要这个版本,但它根本不起作用。我做错了什么?
在您的循环版本中,您不需要 vBody 变量的索引。
var request = require('request');
vSites = ['https://www.google.com','https://www.purple.com','https://www.whosebug.com'];
for (i = 0; i < vSites.length; i++){
request(vSites[i], function (error, response, vBody) {
console.log(vBody);
});
}
此代码在节点 v4.3.2 上对我来说工作正常
除了 中的正确解决方案外,请注意 for 循环并行发送请求。如果您想做的不仅仅是 console.log
.
,数据和错误处理可能具有挑战性
为了更好地处理请求,我建议使用异步控制库,例如 async or bluebird. In comparison, async is easier to understand while bluebird 以提供更好的代码可读性。
下面是一个例子async实现:
var async = require('async');
var request = require('request');
var vSites = ['https://www.google.com', 'http://www.purple.com','https://www.whosebug.com'];
async.map(
vSites,
// `async` will call this function for each `vSite`
function(vSite, next) {
// Reuse the code inside your for-loop, but call `next` to pass the error and result to the final callback
request(vSite, function(err, response, vBody) {
next(err, vBody);
});
},
// The final callback will be executed when all requests are completed or either of them fails
function(err, results) {
console.log(err);
console.log(results);
}
);
希望这对您有所帮助:)
我遇到一个问题,如果我多次尝试使用请求,它就不起作用。我可以举个例子:
request('https://www.google.com', function (error, response, vBody1) {
request('https://www.purple.com', function (error, response, vBody2) {
request('https://www.whosebug.com', function (error, response, vBody3) {
console.log(vBody3);
});
console.log(vBody2);
});
console.log(vBody1);
});
它读取并输出第一个站点的正文,但不读取接下来的两个。 这是另一个例子:
vSites = ['https://www.google.com','https://www.purple.com','https://www.whosebug.com'];
for (i = 0; i < vSites.length; i++){
request(vSites[i], function (error, response, vBody[i]) {
console.log(vBody[i]);
});
}
这个看起来更干净,我想要这个版本,但它根本不起作用。我做错了什么?
在您的循环版本中,您不需要 vBody 变量的索引。
var request = require('request');
vSites = ['https://www.google.com','https://www.purple.com','https://www.whosebug.com'];
for (i = 0; i < vSites.length; i++){
request(vSites[i], function (error, response, vBody) {
console.log(vBody);
});
}
此代码在节点 v4.3.2 上对我来说工作正常
除了 console.log
.
为了更好地处理请求,我建议使用异步控制库,例如 async or bluebird. In comparison, async is easier to understand while bluebird 以提供更好的代码可读性。
下面是一个例子async实现:
var async = require('async');
var request = require('request');
var vSites = ['https://www.google.com', 'http://www.purple.com','https://www.whosebug.com'];
async.map(
vSites,
// `async` will call this function for each `vSite`
function(vSite, next) {
// Reuse the code inside your for-loop, but call `next` to pass the error and result to the final callback
request(vSite, function(err, response, vBody) {
next(err, vBody);
});
},
// The final callback will be executed when all requests are completed or either of them fails
function(err, results) {
console.log(err);
console.log(results);
}
);
希望这对您有所帮助:)