知道async for each内部的async foreach何时完成

know when async foreach inside async for each has finished

本文关键字:async foreach 何时完 内部 for each 知道      更新时间:2023-09-26

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

代码示例:

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