2016-06-11 100 views
1

我瞭解了async module,大家都在談論它。正如我所知,下面的代碼將觸發2db調用完成時的回調。在node.js中使用異步模塊

async.parallel([ 
    function(){ dbcall() }, 
    function(){ dbcall() } 
], callback); 

但是使用異步模塊是必須的嗎?如果我正確包裝我的代碼,它也可以是異步的。就像我在控制器

var Token = require('../models/token'); 
Token.getAllTokens(owner, function(err,callback){ 
    var device_tokens = callback.token; 
    GCM_call(device_tokens); //another ajax call 
    }); 

上面的代碼寫這會工作,我測試了它,GCM_call拭目以待getAllTokens後運行。那麼爲什麼要使用異步模塊?只是爲了讓代碼更具可讀性?

+0

*「但是使用異步模塊是必須的嗎?」*一點都不。它提供了可以使多個異步調用更容易工作的幫助程序方法。 –

回答

1

那麼爲什麼要使用異步模塊?只是爲了讓代碼更具可讀性?

在某種程度上,是的,使它更具可讀性。它提供了一些有用的工具來編寫更具可讀性和更高性能的代碼。

但最重要的是,因爲它解決了使用異步功能時的一些常見問題。您展示了一個使用單個回調的示例,其中第一個代碼塊中的異步模塊示例首先等待某些異步內容完成,然後調用回調函數。你如何用香草js解決這個問題?如果您瞭解Promise API,則可能會說Promise.all([promise1, promise2, ...])。但是當你想要使用像async.series這樣的應用程序時,只需要一次執行一個任務就可以做什麼?在這種情況下,你經常會看到被破解的解決方案,它被稱爲回調地獄,其中回調嵌套到另一個。

所以,你可以創建一個使用無極API,甚至從未來的ECMAScript規範添加使用async/await簡單的香草代碼解決方案,但這個庫是保存你這一點,你出現上述問題,每次重複的麻煩。

+0

可以解決,只是使用回調的嵌套回調,可行的代碼是醜陋的。 –

+1

@AliciaBrandon我已經形容爲回調地獄。它聞起來糟糕的設計。 Promise API可以在所有現代瀏覽器中運行,並且有許多polyfill和實用程序甚至可以將非promise API(例如節點fs)轉換爲Promises,所以沒有理由創建回調地獄。 –