2012-07-17 128 views
0

我使用node.js來調用redis來獲取一些數據。然後數據需要排序到數組 - 不是一個昂貴的過程,但我需要一個函數在排序完成後立即執行。有沒有更好的方式在node.js中做到這一點?

如果我在排序代碼後面寫入函數,它將在數組排序之前觸發。所以我看到了一些解決這個問題的方法:

1)爲()循環寫下一個開始的地方,當前一個在最後一次迭代時;在VERY結束時,使用異步方法確保在所有循環完成後運行。

2)使用setTimeout()。我對這樣做感到不安,因爲它可能取決於需要處理的陣列的大小,它可能太早或太晚會奇蹟般地啓動。

有沒有比嵌套for循環更好的方法呢?

+1

如何異步排序? – 2012-07-17 18:16:46

+0

你用什麼來排列數組?你能不能將一個onComplete函數傳遞給該函數,以便在排序完成後觸發它? – 2012-07-17 18:18:07

+0

在JavaScript中對常規數組進行排序是同步的,因此在sort之後調用的函數不會將數組視爲排序是不可能的。可以舉一些例子嗎? – 2012-07-18 08:20:35

回答

1

看起來你只是想reduceRight

arr.reduceRight(function(p, c, i) { 
    // sort 
    if (i === 0) { 
     // You know you're at the last iteration 
     // so you can call whatever async func you want 
    } 
}); 
+0

不知道這個存在,謝謝。 – 2012-07-17 18:24:52

1

您可以使用setTimeout()並將等待時間設置爲數組大小的某個函數。我同情你,setTimeout()看起來很可怕。但是,這樣的時候這是一種必要的邪惡。

1

我驚訝你使用什麼都代碼訪問的Redis不具備異步能力,但這應該工作:

var done = false; 

function sort(){ 
    ... 
    done = true; 
} 

function sortDone(){ 
    if(done){ 
     ... 
    }else{ 
     process.nextTick(sortDone); 
    } 
} 
相關問題