2012-12-20 29 views
1

在我的NodeJS有一個昂貴的功能,如:轉換的NodeJS昂貴同步任務異步系列

function expensiveCode(){ 
    a.doExensiveOperation(1); 
    b.doAnotherExensiveOperation(2); 
    c.doADiffererentExensiveOperation(3); 
    d.doExensiveOperation(4); 
} 

使得每個子函數調用不同的參數,因此不能在循環中完成。我想扼殺這種昂貴的函數調用,使每個子呼叫在nextTick完成,如:

function expensiveCode(){ 
    process.nextTick(function(){ 
     a.doExensiveOperation(1); 
     process.nextTick(function(){ 
      b.doAnotherExensiveOperation(2); 
      process.nextTick(function(){ 
       c.doADiffererentExensiveOperation(3); 
       process.nextTick(function(){ 
        d.doExensiveOperation(4);     
       }); 
      }); 
     }); 
    }); 
} 

這顯然難看,如果有不同的操作20線將太醜陋,甚至考慮。

我已經回顧了許多類似「async.js」的庫,但它們似乎都希望被調用的函數是異步的 - 在完成時有一個回調函數。我需要一個簡單的方法來做到這一點,而無需將我所有的代碼轉換爲'完成時的回調'方法,這似乎是過度殺傷。

+0

4或20個昂貴的操作在做什麼?是的,通過隔開較小的同步任務來實現「expensiveCode」異步會有所幫助,但是使「a.doExpensiveOperatation」,「b.doAnotherExpiteOperation」等異步通常會更好地爲您提供服務。並努力讓所有你可以異步 - 是的,與回調 - 是慣用的節點。然後,你可以使用'async'等庫來幫助組織你的代碼,並避免回調的深層樹木(如你的第二個代碼片段)。 –

回答

2

對不起,你的泡沫破滅了,但async.waterfallasync.series加上async.apply就是你想要的,是的你需要使這些操作異步。我很難相信你發現了20種不同的計算密集型操作,其中沒有任何IO操作。查看bcrypt庫以查看如何提供CPU密集型調用的同步和異步版本的示例。完成時將代碼轉換爲回調並不過分,它是節點。這是節點中的規則。要麼你的函數沒有IO並且很快完成,或者你使用回調使其異步。期權結束。