2015-10-17 79 views
0

我正在學習node.js,並獲得了有關異步非阻塞I/O的大部分基礎知識。我的問題是,當函數本身不是異步的時候,用回調函數創建一個函數有什麼意義。即使你正在創建的函數調用了一個異步函數,我也找不到你使用回調的原因。我在我看到的node.js代碼中看到了很多。node.js中不必要的回調用法?

例如,發送HTTP請求,並返回請求的所解析的輸出的函數:

function withCallback(url, callback) { 
    request(url, function(err, response, html) { 
    if (err) 
     callback(err, null); 
    callback(null, JSON.parse(html)); 
    }); 
} 

function withoutCallback(url) { 
    request(url, function(err, response, html) { 
    if (err) 
     throw err; 
    return JSON.parse(html); 
    }); 
} 

與回調的第一函數通過回調返回結果,而第二功能,則返回正常。

+3

大部分原因是因爲第二個不起作用。 – Pointy

+0

無法捕獲第二個函數的返回值,因此數據丟失。 – Hawkings

+0

@MaxMastalerz它根本無法工作。 – Pointy

回答

1

打算寫作評論,但過了一段時間。

你在問幾個問題。爲了解決評論者提出的非常正確的觀點,第二個例子不會起作用,並且@Hawkings更清楚地陳述,結果不能被捕獲(通過您的代碼)。它將不起作用,因爲第二個示例中的return正在創建的匿名函數(實際回調傳遞給request)正在調用並將其結果深深返回到request函數中。另外,在你的例子中,在return JSON.parse()行被調用之前,控制將已經返回給調用者withoutCallback,並且如所寫,foo = withoutCallback(...)將導致foo未定義。

如果您查看使用回調函數庫的代碼,您將看到如何調用這些函數,這可能更有意義,爲什麼這不起作用。 (雖然我會建議看一個比請求更簡單的庫 - 如果你對節點相當陌生,我認爲你會發現請求庫有點混亂)。我的問題是,當函數本身不是異步的時候,用回調函數創建一個函數有什麼意義呢?[?]?????????????????? 「

在這種特殊情況下沒有多少意義,除非:a)您希望將來可以通過增加的功能來證明它是異步的,或者b)您希望有一個通用接口,其中的其他實現將是異步的。要使用瀏覽器示例只是因爲它很容易介意,如果您正在實現通用基本數據存儲解決方案,其中一個實現將使用LocalStorage(同步),但其他實現可能使用IndexedDB或遠程調用(都是異步)的實現 - 您仍然希望使用回調來編寫LocalStorage實現,以便您可以輕鬆地在實現之間進行切換。

如果您不喜歡回調風格,請考慮學習使用以及使用其他技術或語言特性來處理異步性的庫,包括Promises,Generators或適用的情況下的EventEmitters。我個人很喜歡Promises。話雖如此,直到你回頭看看回頭看,我纔會提出任何建議。