了解什么是同步以及Node.js / JavaScript中的什么是异步

时间:2016-10-10 19:47:35

标签: javascript node.js asynchronous

假设我在Node.js应用程序中有以下代码:

function bar(){
    //do_stuff
    return value;
}

app.get('/',function(req,res){
    var result = bar();
    res.send(result);
});
  1. 假设函数 bar // do_stuff 是一个高达1000万的while循环。是否保证函数将完成,返回将分配给结果的值,然后才会执行 res.send(result)

  2. 如果函数 bar // do_stuff涉及数据库查询(并且返回值取决于这些查询),该怎么办?在这种情况下,我可以确定 res.send(结果)将使用正确的值执行,在函数 bar 完成后返回吗?

1 个答案:

答案 0 :(得分:2)

Async基本上都是一切,它会干扰JavaScript之外的环境。并不是因为它是必要的,而是因为它是实用的。 Async适用于耗时的任务,因为它不会阻塞JS的主线程。

在while循环的情况下,通常不需要使它异步,虽然你可以使它异步,如果你愿意(例如你知道它需要很长时间来计算,你不想阻止你的主线)。如果HTTP请求或数据库查询不是异步的,JS引擎将停止并且在结果到达之前什么都不做,这在Node.js中不是一个大问题,但是在网页的情况下,这将冻结UI,这肯定会激怒一些用户。

有几种方法可以解决异步任务

  • 回调 - 处理异步任务的函数,接受参数另一个函数,即callback,将在任务完成后立即调用完成(通常它接受成功的回调和错误情况的回调)。
  • 事件 - 处理异步任务的函数,立即返回对象,这是一个event emitter。您将回调附加到事件,此发射器将生成这些回调,然后在事件发生时由发射器调用这些回调。此回调记录为事件侦听器
  • 承诺 - 处理异步任务的函数,立即返回对象,表示未来某些结果的promise。此承诺包含then()fail()always()等方法,您可以通过这些方法注册回调。它与事件发射器非常相似,promises提供了更好的数据流控制,但是在创建时,不能中止。
  • ES next - 未来版本的JavaScript会带来ES6生成器或ES7异步功能。

您可以通过以下事实来区分异步:它不会立即返回结果,但它通常允许您通过参数/参数或返回对象的方法注册回调以供以后调用。

注意:在ES6和ES7的情况下,异步过程不需要回调,但我不会使用这项新技术更多地使这个主题复杂化。

for循环不允许您注册回调,它只是占用JS引擎并尽可能快地完成所有迭代。