如何与async.js并行执行函数?

时间:2014-02-13 03:40:49

标签: javascript async.js

在下面的代码中,我有Array.forEach,它按顺序执行doSomething同步函数:

items.forEach(function(item) {
doSomething(item);
});

我需要并行执行函数(doSomething),使用async.js并尝试以下操作:

async.each(items, function (item, doneCallback) {
                        var startDate = new Date();
                        console.log(item.name().toString() + ' startDate: ' + startDate.toString() + ' - ' + startDate.getMilliseconds().toString());
                        doSomething(item); //Lazy function for many operations.
                        var endDate = new Date();
                        console.log(item.name().toString() + ' endDate' + endDate.toString() + ' - ' + endDate.getMilliseconds().toString());

                        return doneCallback(null);

                    }, function (err) {
                        otherFunction();
                        console.log('Finished');
                    });

但是函数doSomething是按顺序执行的。

我曾尝试使用async.parallel,但函数doSomething已按顺序执行:

items.forEach(function (item) {
                        var func = function (doneCallback) {
                            var startDate = new Date();
                            console.log(item.name().toString() + ' startDate: ' + startDate.toString() + ' - ' + startDate.getMilliseconds().toString());

                            doSomething(item); //Lazy function for many operations.

                            var endDate = new Date();
                            console.log(item.name().toString() + ' endDate' + endDate.toString() + ' - ' + endDate.getMilliseconds().toString());

                            return doneCallback(null);
                        };
                        functions.push(func);
                    });

                    async.parallel(functions, function (err, results) {
                        otherFunction();
                        console.log('Finished');
                    });

如何与doSomething并行执行async.js同步功能?

请帮帮我。

4 个答案:

答案 0 :(得分:2)

  

如何与async.js并行执行doSomething同步功能?

你做不到。 async.js仅用于异步任务,因此名称(另请参阅this answer同步行为)。此外,JavaScript无法并行执行代码,因为它具有公平的单线程范式;它只能在下一次事件中“等待”。

如果您的同步执行确实存在问题,请尝试将数组拆分为较小的块,并将其推迟超时以实现非阻塞行为(请参阅JavaScript Performance Long Running TasksHow to stop intense Javascript loop from freezing the browser)或考虑WebWorkers for真的很重的计算。您可以使用async.js来管理它们。

答案 1 :(得分:1)

不幸的是,Javascript是一种单线程语言。但是,HTML5旨在通过添加Web Workers来改进这一点,{{3}}允许生成真正的操作系统级线程。如果您能够利用HTML5,那么这可能对您有用。您可以为每个项目生成Web Worker,然后等待所有线程完成(加入)。

答案 2 :(得分:0)

如果你可以重构doSomething insto async函数,你可以使用async.parallel函数开始运行这两个函数并等待,直到它们都调用它们的回调。

答案 3 :(得分:0)

您只能按顺序运行这些功能(可能这就是您需要的功能),因此使用eachSeries功能代替each。以下是eachSeries的简短文档:

  

与每个只有迭代器应用于每个项目相同   数组串联。下一个迭代器只在当前迭代器中调用一次   已完成处理。这意味着迭代器函数会   按顺序完成。

表达式synchronous function in parallel - 实际上没有任何意义。并行意味着异步执行。