【问题标题】:NodeJS Async ForEachOf - Stuck in infinite loop?NodeJS Async ForEachOf - 陷入无限循环?
【发布时间】:2018-08-25 19:54:15
【问题描述】:

我完全被难住了。我有一段 NodeJS 代码,我正在使用 Async 库的 forEachOf 函数。代码应该循环遍历 result1 中的每个项目,从中创建一个 tempNode 对象,然后构造并发送一个 SQL 查询(我正在使用 .查询功能)。一旦返回,它应该将此信息添加到 tempNode 并添加到 returnObject 数组。

问题在于,一旦到达 callback() 函数,处理似乎就会挂起。我可以在 callback() 之前的任何位置放置一个 console.log 语句,并验证一切正常(例如 SQL 查询有效),但它从不执行解析代码(也没有显示错误)。它似乎也没有再次通过循环,因为我尝试记录'x'的值,但我只得到一个输出'0'。

这是代码 sn-p。它位于返回承诺的函数内部,因此有 resolvereject

var returnObject = [];
    if (result1.length !=0) {

    // ! This forEachOf gets stuck ! 
    async.forEachOf(result1, function(o_1, x, callback) {
        let tempNode = {
            NODE: result1[x].node,
            FIELDS: [
                {"ID": result1[x].id },
                {"SITE": result1[x].site }
            ] 
        }
        // Construct model query using the node identifier
        var q_model = `SELECT model FROM *TABLE* WHERE name = '${result1[x].node}'`;

        // Second query to determine the BTS model
        mysqlPooler.query(q_model, function(err,result2,fields) {

            if (result2.length !=0 && result2) {
                tempNode.FIELDS.push({"MODEL":result2[0].model});
                returnObject.push(tempNode);
            }
            else {
                reject("ERROR: No MODEL");
            }
            console.log(result2);
            // Done processing this iteration
            callback();

            }); 

    }), function(err)
        console.log(err);
        resolve (returnObject);
         }
    } 
    else 
    {
        reject("ERROR");
    }

提前致谢!!

【问题讨论】:

  • 您的查询结构合理吗?您是否从查询中获得任何输出尝试隔离每个步骤以检测问题。
  • 嗨,是的,查询部分似乎没问题。结果返回后的输出正是我所期望的。即使在 callback() 之前执行 console.log(returnObject) 也能满足我的需要
  • 什么是reject?不要将 promise 代码与 async 库混用。

标签: javascript node.js asynchronous callback


【解决方案1】:

问题是在结尾附近有一个额外的“)”,而在回调函数定义之前缺少一个“{”。最后几行需要改成:

}, function(err) 
  {
  console.log(err);
  resolve (returnObject);
  });
} 
else 
{
  reject("ERROR");
}

基本上,该行为可以通过以下事实来解释:由于括号/格式不正确,async.ForEachOf() 函数的第三个参数(即回调函数)未定义。因此,它似乎不知道循环结束后该做什么!

【讨论】:

  • 你会不会得到一个很容易调试的尾括号错误?
  • 有趣的是我没有收到任何错误。我正在使用 VS 代码,当我遇到错误时,我觉得我可能通过在错误的位置添加括号而进一步搞砸了。也许扩展可以帮助我?谢谢
猜你喜欢
  • 2021-01-19
  • 2020-05-13
  • 1970-01-01
  • 2013-03-17
  • 2021-02-15
  • 2022-01-23
相关资源
最近更新 更多