2014-02-13 53 views
0

在下面的代码,我已经Array.forEach,它执行序列中的doSomething同步功能:如何与async.js并行执行函数?

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

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

请帮帮我。

回答

2

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

你不行。 async.js仅用于异步任务,因此名称(同时参见this answer)。而且,JavaScript不能并行执行代码,因为它是单一的线程范例;它只能“等待”下一个事件的并行。

如果你真的与你同步执行的问题,试图分裂较小的块阵列并与非阻塞行为超时(见JavaScript Performance Long Running TasksHow to stop intense Javascript loop from freezing the browser)推迟他们,或考虑为真重计算WebWorkers。那么你可以使用async.js来管理它们。

+0

感谢您的信息,后来我已经尝试与parallel.js,但我有问题与IE浏览器。 [Parallel.js在IE中有Blob问题](http:// stackoverflow。COM /问题/ 21744104 /并行JS-有-问题,与二进制大对象 - 在-IE) – kuskunko

0

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

0

你只能按顺序运行这些funcs(可能这是你需要的),为此使用eachSeries函数而不是each。下面是eachSeries短文档:

同为每个唯一的迭代器被施加到每个项目串联 阵列英寸只有在当前的一个 已完成处理后才会调用下一个迭代器。这意味着迭代器函数将按顺序完成 。

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

1

不幸的是,Javascript是一种单线程语言。但是,HTML5旨在通过添加Web Workers来改善这一点,该功能允许生成真正的OS级别的线程。如果你能够利用HTML5,那么这可能适合你。您可以为每个项目生成一个Web Worker,然后等待所有线程完成(连接)。