javascript - 知道 async foreach 内的 async foreach 何时完成

标签 javascript node.js asynchronous

我在 node.js 中使用异步库,并且在另一个 async.forEach 调用内有一个 async.forEach 调用,我需要知道异步调用何时完全完成处理.

代码示例:

var content = '...';
var resultArr = [];

async.each(regexArr, function(regex) {
        var matches = content.match(regex);
        async.each(matches, function(match) {
            var result = regex.exec(match);
            regex.lastIndex = 0;
            resultArr.push(result[1]);
        });
    }, function(err) {
        // I need to know when ALL inner async.forEach finished processing 
        // for ALL outside async.forEach and then do something with the resultArr
    });

最佳答案

您可以通过使用 async.map 和附加回调来处理内部回调结果的集合来强制同步。

尽管如此,正如其他人所说,对于 JS,执行是在单个线程上进行的,所以我首先包含了更简单的同步版本。

// Synchronous version is just as good for Regex stuff.
var content = '...';
var resultArr = [].concat.apply([], regexArr.map(function(regex) {
    return (content.match(regex) || []).map(function(match) {
        return (regex.exec(match) || [])[1];
    });
}));

    // IN THIS EXAMPLE, SYNCHRONOUS WOULD WORK TOO...


    var content = '...';
    collectRegexResults(content, regexArr, function(err, flatRegexResults) {
        // Handle errors.
        // flatRegexResults is equivalent to resultArr
        //    from your question.
    });

    function collectSingleRegexFor(content) {
        return function(regex, passBackGroup) {
            var matches = content.match(regex);
            // Note use of || [] if match is null
            async.map(matches || [], function(match, finishSingle) {
                try {
                    finishSingle(null, regex.exec(match)[1]);
                } catch (err) {
                    finishSingle(err, null);
                }
            }, passBackGroup); // Submits to outer as regexSets element
        };
    }

    function collectRegexResults(text, regexArr, doStuffPostComplete) {
        async.map(regexArr, collectSingleRegexFor(text), function(err, regexSets) {
            if (err) {
                return doStuffPostComplete(err);
            }
            // Flattening the Array again.
            doStuffPostComplete(null, [].concat.apply([], regexSets));
        });
    }

关于javascript - 知道 async foreach 内的 async foreach 何时完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34700988/

相关文章:

c# - 异步 Controller 给我带来了什么好处?

javascript - ReactTransitionGroup 不适用于 React-redux 连接组件

javascript - 如何在网站上播放通知声音?

node.js - 错误: Failed to load gRPC binary module

javascript - 如何从异步调用返回响应?

c# - 动态链接 `Task<T>` 且不阻塞线程

javascript - Grunt registerTask() 未运行列表中的任务

javascript - 在使用 JavaScript 构建 HTML 时保持关注点分离的最佳实践是什么?

node.js - 云任务 - 创建任务 - 错误 : No connection established, 代码:14

javascript - 为什么下面的代码总是在立即之前打印超时?