Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/437.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js-循环异步_Javascript_Mysql_Node.js_Loops - Fatal编程技术网

Javascript Node.js-循环异步

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

我是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();
    }

});
但我真正想要的是:

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();