当前位置: 首页 > 面试题库 >

在node.js中异步循环

韦睿
2023-03-14
问题内容

我是这个Node.js的新手..我对此回调有点困惑..在我的应用程序中,我在for循环内调用异步函数调用,我想我的问题是在得到异步调用响应之前,
for循环被循环。

我的代码:

async.forEach(Object.keys(config), function(key, next) {
        search(config[key].query, function(err, result) { // 
        console.log("fffffffffff="+ util.inspect(result))-------- >>>Getting undefined..
            if (err) return next(err) // 
            var json = JSON.stringify({
                "result": result
            });
            results[key] = {
                "result": result
            }
            console.log("rrrrrrrr="+util.inspect(results[key]))
            next() // <---- critical piece.  This is how the forEach knows to continue to the next loop.  Must be called inside search's callback so that it doesn't loop prematurely.                   
        })
    },
    function(err) {
        console.log('iterating done');

         res.writeHead(200, {
        'content-type': 'application/json'
    });
    res.end(JSON.stringify(results));  
    });


}

搜索功能代码:

var matches = [];
    var qrySubString = query.substring(0, 4);
    client.query("select * from xxxxxxxxx where level4 ILIKE '%" + query + "%'", function(err, row1, fields) {
        for (var id in row1.rows) {                
            var match, name;                
            if (query == row1.rows[id].level4) {
                match = true;
                name = row1.rows[id].level4;
            }
            else {
                match = false;
                name = query;
            }
            matches.push({
                "id": id,
                "name": row1.rows[id].level4,
                "score": 100,
                "match": match,
                "type": [{
                    "id": "/people/presidents",
                    "name": "US President"
                }]
            })
        }           
        callback(matches);
    })

我想在成功执行1个搜索功能后执行for循环,我想我必须使用async for loop。请指导我解决此问题。


问题答案:

我将您的代码示例简化为以下几行,以使您更容易理解该概念。

var results = [];
var config = JSON.parse(queries);
for (var key in config) {
    var query = config[key].query;
    search(query, function(result) {
        results.push(result);
    });
}
res.writeHead( ... );
res.end(results);

先前代码的问题在于该search函数是异步的,因此在循环结束时,没有调用任何回调函数。因此,的列表results为空。

要解决此问题,您必须将代码放在循环后的回调函数中。

    search(query, function(result) {
        results.push(result);
        // Put res.writeHead( ... ) and res.end(results) here
    });

但是,由于多次调用了回调函数(每次迭代一次),因此您需要以某种方式知道所有回调都已被调用。为此,您需要计算回调的数量,并检查该数量是否等于异步函数调用的数量。

这是一个完整的示例:

var results = [];
var config = JSON.parse(queries);
var onComplete = function() {
    res.writeHead( ... );
    res.end(results);
};
var keys = Object.keys(config);
var tasksToGo = keys.length;
if (tasksToGo === 0) {
   onComplete();
} else {
    // There is at least one element, so the callback will be called.
    keys.forEach(function(key) {
        var query = config[key].query;
        search(query, function(result) {
            results.push(result);
            if (--tasksToGo === 0) {
                // No tasks left, good to go
                onComplete();
            }
        });
    });
}

注意:上一个示例中的异步代码是并行执行的。如果需要按特定顺序调用函数,则可以使用递归获得所需的效果:

var results = [];
var config = JSON.parse(queries);
var keys = Object.keys(config);
(function next(index) {
    if (index === keys.length) { // No items left
        res.writeHead( ... );
        res.end(results);
        return;
    }
    var key = keys[index];
    var query = config[key].query;
    search(query, function(result) {
        results.push(result);
        next(index + 1);
    });
})(0);

我所展示的是概念,您可以在实现中使用许多(第三方)NodeJS模块之一,例如async。



 类似资料:
  • 问题内容: 我是JavaScript和node.js的新手。我想遍历目录并将所有文件统计信息(而不是其他目录)添加到数组中。如下所示,我的代码存在问题,因为回调可能在for循环完成后被调用,因此在回调方法中使用“ i”变量将不起作用。但是代码应如何显示,以便以下代码段起作用?它与闭包有关吗? 感谢帮助! 问题答案: 您需要使用闭包是正确的。您应该将循环的内容包装在一个自调用函数中,以保留每次迭代的

  • 问题内容: 我是Node的新手,并试图确保我对JSON驱动的Web应用程序使用了合理的设计。 我已经在Redis中存储了一堆数据,并且正在通过node检索它们,并将结果从Redis中流出来。这是我正在做的一个很好的例子: 本质上,我是从Redis获取一组密钥,然后请求每个密钥,然后将结果流式传输到半手动创建的JSON(来自Redis的字符串已经在JSON中)。现在,这很好用,但是我不禁会以为i =

  • 问题内容: 我在使用redis和nodejs时遇到问题。我必须遍历电话号码列表,并检查我的Redis数据库中是否存在该号码。这是我的代码: “之后”控制台日志出现在“之前”控制台日志之前,并且回调始终返回一个empty 。这是因为如果我很了解,对redis的请求是异步的。但问题是我不知道如何使它起作用。我能怎么做 ? 问题答案: 您有两个主要问题。 您的变量将不是您想要的变量。可以通过更改 数组的

  • 问题内容: 我该如何做这项工作 我试图从异步之一获取同步功能,我需要它来使用FreeTds异步查询作为同步之一 问题答案: 使用deasync-用C ++编写的模块,它将Node.js事件循环暴露给JavaScript。该模块还公开了一个函数,该函数阻止后续代码,但不阻止整个线程,也不引起繁忙的等待。您可以将函数放入循环中:

  • 问题内容: 有大量的库可帮助修复回调综合症的层次。 实际上,太多了,我该使用哪一个? 问题答案: 我使用Async.js。 异步是一个实用程序模块,它提供直接,强大的功能来使用异步JavaScript。尽管最初设计用于node.js,但也可以直接在浏览器中使用。 例子

  • 问题内容: 我有2个异步运行的函数。我想使用瀑布模型来编写它们。问题是,我不知道如何。 这是我的代码: 知道如何使用Waterfall编写它,以便我可以控制它吗?请给我写一些例子,因为我是node.js的新手 问题答案: 首先确定步骤并将其编写为异步函数(带有回调参数) 读取文件 } 处理文件(在示例中,我删除了大部分console.log) } 请注意,我在这里没有进行特定的错误处理,我将利用a