2014-02-13 80 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,然後等待所有線程完成(連接)。