假设我在Node.js应用程序中有以下代码:
function bar(){
//do_stuff
return value;
}
app.get('/',function(req,res){
var result = bar();
res.send(result);
});
假设函数 bar // do_stuff 是一个高达1000万的while循环。是否保证函数将完成,返回将分配给结果的值,然后才会执行 res.send(result)?
如果函数 bar // do_stuff涉及数据库查询(并且返回值取决于这些查询),该怎么办?在这种情况下,我可以确定 res.send(结果)将使用正确的值执行,在函数 bar 完成后返回吗?
答案 0 :(得分:2)
Async基本上都是一切,它会干扰JavaScript之外的环境。并不是因为它是必要的,而是因为它是实用的。 Async适用于耗时的任务,因为它不会阻塞JS的主线程。
在while循环的情况下,通常不需要使它异步,虽然你可以使它异步,如果你愿意(例如你知道它需要很长时间来计算,你不想阻止你的主线)。如果HTTP请求或数据库查询不是异步的,JS引擎将停止并且在结果到达之前什么都不做,这在Node.js中不是一个大问题,但是在网页的情况下,这将冻结UI,这肯定会激怒一些用户。
有几种方法可以解决异步任务
callback
,将在任务完成后立即调用完成(通常它接受成功的回调和错误情况的回调)。event emitter
。您将回调附加到事件,此发射器将生成这些回调,然后在事件发生时由发射器调用这些回调。此回调记录为事件侦听器。promise
。此承诺包含then()
,fail()
,always()
等方法,您可以通过这些方法注册回调。它与事件发射器非常相似,promises提供了更好的数据流控制,但是在创建时,不能中止。您可以通过以下事实来区分异步:它不会立即返回结果,但它通常允许您通过参数/参数或返回对象的方法注册回调以供以后调用。
注意:在ES6和ES7的情况下,异步过程不需要回调,但我不会使用这项新技术更多地使这个主题复杂化。
for
循环不允许您注册回调,它只是占用JS引擎并尽可能快地完成所有迭代。