2013-09-11 167 views
0

我現在對nodejs非常熟悉,但是我從來沒有試過建立過一個模塊。我很好奇有一些異步功能。編寫異步javascript函數

  1. 如果你正在寫,只是返回一個值的函數,如果它值得讓異步例如,這應該寫入異步?:

    exports.getFilename =函數(){ 返回文件名; }

  2. 接下來,在編寫異步函數時,是否正在使用足夠性能的回調編寫函數,還是建議使用線程庫對其進行線程化?

對不起,我有點明顯的問題,我noramlly是一個調用這些函數

+0

1.否2. JavaScript/Node中沒有線程。 –

+0

好吧,我知道有可能使用外部庫進行線程並且有集羣,但是我不知道實際線程不支持。謝謝! –

+0

@RandomUser節點確實使用多線程(以及羣集的多進程)。它只是不會讓任何其他人可用於JavaScript代碼。他們只是[本地插件](http://nodejs.org/api/addons。html)來支持開發異步API。 –

回答

0

回調和asynchronousness是兩回事,雖然他們是因爲在JavaScript回調有關,是讓你管理的唯一機制控制異步代碼中的流程。

天氣還是非非異步函數應該接受回調取決於函數的功能。迭代函數是一種非異步函數,但可用於提供回調函數的一個示例。 Array.each()就是一個很好的例子。 Javascript不允許您傳遞代碼塊,以便將函數傳遞到迭代函數。

另一個例子是過濾函數,它修改傳入數據並返回修改後的版本。 Array.sort()就是一個很好的例子。將函數傳遞給它可以讓你應用自己的條件來對數組進行排序。

實際上,過濾函數有更強的接受函數/回調的原因,因爲它改變了算法的行爲。迭代函數只是for循環的語法糖,因此有點多餘。儘管如此,它們確實使代碼更好閱讀。

天氣還是不應該是異步的功能是另一回事。如果它需要很長時間來計算(如I/O操作或大型矩陣計算),那麼它應該是異步的。 「長」多長時間取決於你自己的容忍度。一般來說,對於一個繁忙的網站,請求不應超過100毫秒才能完成(換句話說,您應該至少能夠每秒處理10次點擊)。如果一個操作需要比這個更長的時間,那麼你應該分解它並使其異步,否則你將冒着使網站對其他用戶不響應的風險。對於真正繁忙的網站,您不應該容忍長於10毫秒的操作。

從上面的解釋中可以明顯看出,接受函數或回調作爲參數並不會使函數異步。最簡單的純js方法是使用setTimeout來打破長時間的計算。當然,該操作仍然發生在與主節點進程相同的線程中,但至少不會阻止其他請求。要在您的服務器上使用多核CPU,您可以使用NPM或羣集上的某個線程庫來使您的功能異步。

+0

我認爲接受函數的參數和「回調」之間有區別,這是接受函數的特定用例。 「回調」是一個函數,你稍後會調用它,因爲你的異步代碼完成或者事件被觸發等等,但是這與提供一個用於對數組元素進行排序的函數並不完全相同。我認爲重要的是要清楚我們實際上「回調」的含義。 –

+1

@JonSurrell:並非如此在JavaScript編程。一個被另一個函數調用的函數通常被稱爲'callback',而不管它是同步的還是異步的。我意識到其他編程語言和計算機科學對這個術語有其他定義。但JavaScript程序員已經用它來表示一個簡單的函數,它作爲參數傳遞。這種用法在討論板,wiki文章,博客和書籍中很常見。 – slebetman

+0

@JonSurrell:這不是唯一一個在javascript中具體定義與一般定義不同的詞。例如,Javascript使用「上下文」一詞來指代對象綁定和繼承鏈。通常「上下文」是指代碼如何被評估 - 例如在定義上下文或表達式上下文中。 Perl例如可以在列表上下文中執行代碼(當在列表構造中調用函數/表達式時),標量上下文和undef上下文。 – slebetman