【发布时间】:2016-12-07 19:09:29
【问题描述】:
我是 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(err) throw err;
for (var i = 0; i < rows.length; i++) {
console.log('Processing ID: ' + rows[i].id);
test();
}
});
似乎循环并没有等待 boo 似乎继续遍历所有值。这是输出:
Processing ID: 1
Processing ID: 2
boo
boo
但我真正想要的是:
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呼叫打印到控制台会有 0.1 秒的延迟。但即使这样也不能解决问题。 -
顺序对您的问题很重要吗?异步文档明确指出“注意,由于此函数将 iteratee 并行应用于每个项目,因此无法保证 iteratee 函数将按顺序完成。”
-
@aaaaaa 不是真的。但这是一个简单的例子,所以我可以理解这个过程。因为正在使用 webdriver 并且:“driver.wait(until.elementLocated...”。for 不会等待元素被定位并继续循环过程。
-
试试 async.each(见我的回答)
-
谁对所有答案投了反对票?我还在测试那些..
标签: javascript mysql node.js loops