异步Vs在NodeJS中同步

时间:2013-12-17 13:03:49

标签: javascript node.js

我是NodeJS的新手。我已经看到同一个任务有单独的异步和同步函数(例如:{fs.writeFile,fs.writeFileSync},{fs.read, fs.readSync})。

任何人都可以解释为什么会这样吗?有什么区别?

4 个答案:

答案 0 :(得分:12)

异步:

  1. 发送请求
  2. 继续使用其他代码
  3. 随时回复回复
  4. 同步:

    1. 发送请求
    2. 等待回复
    3. 在回复后继续使用其他代码

答案 1 :(得分:9)

同时拥有这些操作的同步和异步验证的原因是它们可能非常耗时,并且由于node.js具有单线程主事件循环,因此在任何情况下都不要阻止事件循环使用慢速同步函数调用。

这就是为什么一切都是使用回调(或承诺,誓言,或者你在异步的东西中的特殊品味)来完成的原因。通过这种方式,您可以拥有一个事件循环,该循环只调用异步函数并在回调中处理异步函数的结果。

这是node.js的主要优势之一,也是基本规则之一:“不要阻止主事件循环”。

答案 2 :(得分:3)

在引用node.js fs.writeFile doc时,它将数据异步写入文件。 这意味着如果您有以下代码:

1. some db operation
2. some non-related db operation

在这种情况下,第1次操作不会阻止第2次操作。第2次操作在第1次之后立即执行(无需等待完成)

但是,有些情况如下:

1. some db operation 
2. some related db operations(which you can't put in callbacks) and forcefully want to be after 1st operation.

然后使用fs.writeFileSync

答案 3 :(得分:0)

Synchronous是一个阻塞调用,在该调用结束之前,线程被阻塞。异步是一种非阻塞调用,线程继续执行其余的操作,为什么调用是单独执行的。

引自NodeJS Documentations

  

阻止是在Node.js中执行其他JavaScript的时间   进程必须等到非JavaScript操作完成。这个   因为事件循环无法继续运行而发生   正在进行阻塞操作时使用JavaScript。

     

阻止方法执行同步非阻止方法   执行异步

使用Async方法与同步方法

如果您调用的是像I / O操作(文件,数据库访问等)这样的大量操作,请使用异步方法,因为您不想在执行大量操作的同时阻止整个过程

但是如果它是常规调用,其结果对于其余进程的运行很重要,请使用Sync方法,其中进程将停止,直到调用完成。

如果您正在使用AWS lambda,例如,进行异步调用(将异步执行I / O操作),可能会在完成其余过程后立即终止Lambda函数。因此,确定何时使用同步调用和异步调用非常重要。

有关详细信息,请阅读以下doc