繁体   English   中英

For循环内部的JavaScript顺序/同步回调函数

[英]JavaScript Sequential / Synchronous Callback Functions Inside For Loop

我目前有这种情况...

function loop (num1, callback) {
    for (i = 0; i < num1; i++) {
        console.log("loop count: " + i);
        callback();
    }
}

当前正在输出以下示例结果:

loop count: 1
loop count: 2
loop count: 3
...
loop count: num1 - 1
callback output 1
callback output 2
callback output 3
...
callback output num1 - 1

我要执行的操作是等到每个回调完成执行并输出其结果,然后再移至循环中的下一项。 即按照下面的示例输出:

loop count: 1
callback output 1
loop count: 2
callback output 2
loop count: 3
callback output 3
...
loop count: num1 - 1
callback output num1 - 1

有谁知道我如何在我的函数中实现这种顺序/同步操作模式?

先谢谢您的帮助!

更新...

好的,所以像这样调用回调函数...

loop(10, updateDB);

传递给循环的回调函数如下...

function updateDB(sql_string, responseObject) {
  var mysql = require('mysql');
  var connection = mysql.createConnection({
      host : 'localhost',
      user : 'user',
      password : 'password',
      database : 'database',
  });
  connection.connect();
  var query = sql_string;
  connection.query(query, function(err, results) {
      connection.end();
      if (err) {
        console.log(err);
        responseObject.push({"queryStatus":"FAIL"});
      }
      if (err == null) {
        console.log('Changed ' + results.changedRows + ' rows');
        responseObject.push({"queryStatus":"PASS"});
      }
  });
};

您的回调显然是异步的,但这并没有使您在继续循环之前强迫其全部执行的愿望消失了。 这是一种使用Promises调用下一个循环周期的方法。

 function loop(max, callback, i) { i = i || 0; if (i < max) { console.log("loop count: " + i); return callback(i).then(function() { return loop(max, callback, ++i); }); } } function doAsyncStuff(passedNum) { return new Promise(function(resolve, reject) { // Fake asynchronous stuff for 500ms using setTimeout. // Put your real async code here, calling "resolve" when // it's finished. setTimeout(function() { console.log("callback count: " + passedNum); resolve(); }, 500); }); } loop(5, doAsyncStuff).then(function() { console.log('All done looping!') }); 

您可以使用javascript的承诺来使用它

 function callback(item) {
   return new Promise(function(resolve, reject) {
    console.log('callback item ', item);
    resolve(item);
   });
 }

 function loopCall(num) {
   for (var i = 1; i < num; i++) {
         console.log('loop item ', i);
         callback(i).then(function(data) {

         }, function(err) {
            console.log(err);
            console.log('Something Broke');
         })
   }
 }

loopCall(120);

这是获取所需输出的方法。如果要使用node.js环境,并且有一个npm模块async

希望对您有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM