我是nodejs新手,正在习惯所有异步的东西。
现在使用:- Node-MySQL (https://github.com/felixge/node-mysql) - Request (https://github.com/mikeal/request)模块。
我正在查询一个很大的URL列表(10,000个URL),并尝试向它们发送一个HTTP GET请求,以获取它们的HTTP状态。
它可以工作,但问题是,当我运行代码时,当MySQL查询中的每一行被返回时,processURL函数被调用,它在每个URL值之后记录“之前”和“之后”(据我所知)发送HTTP请求,但在返回HTTP状态之前等待MySQL查询完成。
简单地说,它不能在查询运行时检查这些URL并返回其结果。它等待查询完成,以返回HTTP请求的结果。
这在我看来毫无意义,因为它在流式传输每一行时都会运行processURL函数。下面是完整的代码:
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'localhost',
user : 'root',
password : '',
database : 'urlDB',
});
var query = connection.query('SELECT * FROM urls LIMIT 10000');
query.on('error', function(err) {
console.log(err);
})
query.on('result', function(row) {
processURL(row.urlValue, function() {
});
console.log(row.urlValue);
})
function processURL (url){
var request = require('request');
var startTime = new Date();
console.log('BEFORE');
request({
uri: url,
method: 'GET',
}, function(error, response, body) {
console.log('INSIDE');
var endTime = new Date();
if (!error) {
console.log(response.statusCode + ' Start: ' + startTime + ' End: ' + endTime);
} else {
console.log('timeout');
}
})
console.log('AFTER');
}输出如下: www.google.com BEFORE AFTER www.yahoo.com BEFORE AFTER www.cnn.com BEFORE AFTER ...but no 'INSIDE‘直到查询完成。
我们非常感谢您的帮助。
发布于 2012-12-30 00:36:12
我修改了您的示例,以获得更慢的结果,它可以按预期工作。您可以复制-粘贴来尝试:
var request = require('request');
var urls = ['http://google.com', 'http://yahoo.com', 'http://ninjaturtles.com'];
getResultSlowly();
function getResultSlowly() {
var result = urls.shift();
if (!result) return;
console.log(result);
processUrl(result);
setTimeout(getResultSlowly, 1000);
}
function processUrl(url) {
var startTime = new Date();
console.log('BEFORE');
request({
uri: url,
method: 'GET',
}, function(error, response, body) {
console.log('INSIDE');
var endTime = new Date();
if (!error) {
console.log(response.statusCode + ' Start: ' + startTime + ' End: ' + endTime);
} else {
console.log('timeout');
}
})
console.log('AFTER');
}很可能网络延迟只是掩盖了异步行为。
查询的结果将几乎立即返回,并在您执行代码时立即触发几个result事件。然而,您的request事件将花费相当长的时间(即使只有一两毫秒),因为它必须与谷歌或雅虎或其他任何人建立连接。
输出:
$ node asynctest.js
http://google.com
BEFORE
AFTER
INSIDE
200 Start: Sat Dec 29 2012 11:31:34 GMT-0500 (EST) End: Sat Dec 29 2012 11:31:34 GMT-0500 (EST)
http://yahoo.com
BEFORE
AFTER
http://ninjaturtles.com
BEFORE
AFTER
INSIDE
200 Start: Sat Dec 29 2012 11:31:36 GMT-0500 (EST) End: Sat Dec 29 2012 11:31:37 GMT-0500 (EST)
INSIDE
200 Start: Sat Dec 29 2012 11:31:35 GMT-0500 (EST) End: Sat Dec 29 2012 11:31:38 GMT-0500 (EST)https://stackoverflow.com/questions/14083276
复制相似问题