2016-06-11 77 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,所以没有理由创建回调地狱。 –