簡體   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