簡體   English   中英

如何在node.js中為for循環編寫回調函數

[英]How to write callback function inside for loop in node.js

我試圖在for循環中編寫一個函數。 但是循環不會等到獲得內部函數的響應。 如何在每次獲得函數響應之前停止循環?

在此過程中,下一個循環取決於函數的響應。

我的示例代碼:

var a = function(data, callback) {
    var d = 1;
    for (var i = 0; i < data.length; i++) {
        b(d, function(err, result) {
            if (!err) {
                d = result;
            }
            if ((i + 1) === data.length) {
                callback(err, 'something');
            }
        });
    }
}
var b = function(data, callback) {
    var c = data + 1;
    callback(null, c);
}

在這段代碼中, for循環不會等到它從函數b獲得響應。

您可以通過在回調中調用遞歸函數調用來輕松迭代輸入數組:

'use strict';

const a = function(data, callback) {
  let i = 0;
  let sum = 0;

  // loop function
  function next() {
    const x = data[i++];
    if (!x) {
      return callback(null, sum);
    }

    return b(x, (err, data) => {
      sum += data;
      next();
    });
  }

  next(); // starts iterating
}

// multiplies data * 3
const b = function(data, callback) {
   let c = data * 3;
   callback(null, c);
}


a([1, 2, 3], (err, data) => {
  console.log(data); // prints 18
});

使用Promises

您的代碼可以很容易地重構為使用Promise

function a (data) {
  let promise = Promise.resolve(1);
  for (let i = 0; i < data.length; i++) {
    promise = promise.then(b);
  }
  return promise.then(function (v) {
    // v is the value computed by the promise chain
    return 'something';
  });
}

function b (data) {
  // some async action that returns a promise
  return Promise.resolve(data + 1);
}

用法:

a(['a', 'b', 'c']).then(result => console.log(result)); // logs 'something'

使用異步功能

使用promises允許您使用異步函數處理異步代碼,如同步代碼:

async function a (data) {
  let v = 1;
  for (let i = 0; i < data.length; i++) {
    // looks like synchronous code, but is asynchronous
    v = await b(v);
  }
  // v is the value computed by the asynchronous loop
  return 'something';
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM