【问题标题】:How to write callback function inside for loop in node.js如何在node.js的for循环中编写回调函数
【发布时间】:2017-09-01 06:29:19
【问题描述】:

我正在尝试在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 获得响应。

【问题讨论】:

  • “我怎样才能停止 for 循环,直到每次都得到函数的响应。” 你不能。 for 是同步的。在这种情况下不要使用循环。
  • 感谢您的回复。但是我需要这种类型的操作,我该怎么做?

标签: javascript node.js for-loop callback


【解决方案1】:

您可以通过在回调中调用递归函数来轻松地迭代您的输入数组:

'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
});

【讨论】:

    【解决方案2】:

    使用承诺

    您的代码可以轻松重构为使用Promises:

    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'
    

    使用异步函数

    使用 Promise 允许您使用 async functions 将异步代码视为同步代码:

    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';
    }
    

    【讨论】:

      猜你喜欢
      • 2018-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多