在 Node.js 中脱离回调函数中的“for”循环

Break out of a "for" loop within a callback function, in Node.js

本文关键字:for 函数 循环 回调 Node js      更新时间:2023-09-26

关于下面的代码,我的目标是突破 FOR 循环 B 并继续使用 FOR 循环 A,但在回调函数中。

for(var a of arrA) {
    // ...
    // ...
    for(var b of arrB) {
        // ...
        // ...
        PartService.getPart(a.id, function(err, returnObj) {
            break;
        });
    }
}

这会给我带来我想要的结果吗?如果没有,我该如何实现?


编辑 16-4-28 3:28 MST

  • 回调函数确实是异步的

根据其中一个答案和下面的所有评论,在不改变问题范围的情况下,也许此时最好的问题是"如何在 Node.js 中实现同步回调函数?我正在考虑重构我的代码以删除 for 循环,但我仍然很好奇我是否仍然可以使用同步回调函数朝这个方向发展。我知道 Underscore.js 使用同步回调函数,但我不知道如何实现它们。

您可以尝试这样的事情,但是它仅在同步触发回调时才有效。

for(var a of arrA) {
  let shouldBreak = false;
  for(var b of arrB) {
    if (shouldBreak)
      break;
   // rest of code
     PartService.getPart(a.id, function(err, returnObj) { // when the callback is called immediately it will work, if it's called later, it's unlikely to work
       shouldBreak = true;
    });

这可能不会给你预期的结果。 您可以使用事件事件发射器或异步模块。

您也可以尝试让它在没有for循环的情况下自行循环。使其异步。

for (var a of arrA) {
    var _loop = function(i) {
        // Make modifications to arrB
        
        PartService.getPart(id, function(err, retObj) {
            if (err) {
                throw err;
            }
            if (retObj.success) {
                // If successful, call function again
                _loop(i + 1);
            } else {
                // We've broken out of the loop
            }
        });
    };
    // Instantiate loop
    _loop(0);
}