在下面的代码中,我有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
同步功能?
请帮帮我。
答案 0 :(得分:2)
如何与async.js并行执行doSomething同步功能?
你做不到。 async.js
仅用于异步任务,因此名称(另请参阅this answer同步行为)。此外,JavaScript无法并行执行代码,因为它具有公平的单线程范式;它只能在下一次事件中“等待”。
如果您的同步执行确实存在问题,请尝试将数组拆分为较小的块,并将其推迟超时以实现非阻塞行为(请参阅JavaScript Performance Long Running Tasks,How 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
- 实际上没有任何意义。并行意味着异步执行。