Javascript Node.js-循环异步
我是nodejs新手,尝试在for循环中调用一个函数来打印一些东西Javascript Node.js-循环异步,javascript,mysql,node.js,loops,Javascript,Mysql,Node.js,Loops,我是nodejs新手,尝试在for循环中调用一个函数来打印一些东西 var mysql = require("mysql"), async = require("async"); function test() { setTimeout(function () { console.log('boo'); }, 100) } con.query('SELECT * FROM database', function(err, rows){ if(er
var mysql = require("mysql"),
async = require("async");
function test() {
setTimeout(function () {
console.log('boo');
}, 100)
}
con.query('SELECT * FROM database', function(err, rows){
if(err) throw err;
for (var i = 0; i < rows.length; i++) {
console.log('Processing ID: ' + rows[i].id);
test();
}
});
但我真正想要的是:
Processing ID: 1
boo
Processing ID: 2
boo
我还尝试使用异步库,如下所示:
async.each(rows, function(rows, callback) {
console.log('Processing ID: ' + rows.id);
test();
callback();
}, function(err) {
if( err ) {
console.log('A file failed to process');
} else {
console.log('All files have been processed successfully');
}
});
setTimeout
是异步的,不会阻塞代码的其余部分。它的基本意思是“我将在100毫秒内调用console.log('boo')
,同时继续执行其余的代码”。
这和…有关,这在本文中得到了很好的解释
使用可以使用的异步库
eachSeries
将等待每次迭代,直到调用回调。由于setTimeout
是异步的,因此需要在那里调用回调
工作JSBin:
以下是您解决问题的方法
哪张照片
Processing ID: a1
boo
Processing ID: b2
boo
Processing ID: c3
boo
您的代码存在问题:
#1-async。每个
都会立即为所有行触发,这就是为什么console.log会立即为所有处理ID触发的原因
#2-
test()
启动一个新的异步函数,该函数显示“0.1秒后,键入”boo,每个列表项执行一次。因此,在打印完所有进程ID后0.1秒,boo
会出现您使用setTimeout
调用将进程ID打印到控制台时有0.1秒的延迟。但即使这样也不能解决问题。顺序对你的问题重要吗?异步文档明确声明“注意,由于此函数并行地将iteratee应用于每个项,因此无法保证iteratee函数将按顺序完成。”@aaaaaa实际上并非如此。但这只是一个简单的例子,我可以理解这个过程。因为我正在使用webdriver和:“driver.wait(until.elementLocated…”。for不等待元素被定位并继续循环过程。请尝试async.each(参见我的答案),谁对所有答案投了反对票?我仍在测试这些答案。他没有问为什么会出现这样的输出。@Mahi他问了:“但这只是一个简单的例子,我可以理解这个过程。”@ziad.ali抱歉,我的错误,是eachSeries
@moezalz起作用了!谢谢。每个“callback();”都意味着循环的下一个行程吗?如果我想知道for each何时结束,我可以调用“connection.end()”'我做什么?是否有一个函数可以这样做?是的,当调用回调时,下一次迭代开始。完成后,调用最后一次回调。请参阅
async.eachSeries(
rows,
function(row, callback) {
console.log('Processing ID: ' + row.id)
setTimeout(function() {
console.log('boo')
callback()
}, 100)
},
function(){
// is called when done
}
)
const async = require('async');
const processingIds = ['a1', 'b2', 'c3'];
function test(aProcessingId, done) {
setTimeout(function () {
console.log('Processing ID: ' + aProcessingId);
console.log('boo');
done();
}, 100);
}
function iteratee(aProcessingId, done) {
test(aProcessingId, done);
}
async.each(processingIds, iteratee);
Processing ID: a1
boo
Processing ID: b2
boo
Processing ID: c3
boo
async.each(rows, function(rows, callback) {
console.log('Processing ID: ' + rows.id); // #1
test(); // #2
callback();