我是NodeJS的新手。我已经看到同一个任务有单独的异步和同步函数(例如:{fs.writeFile,fs.writeFileSync
},{fs.read, fs.readSync
})。
任何人都可以解释为什么会这样吗?有什么区别?
答案 0 :(得分:12)
异步:
同步:
答案 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是一个阻塞调用,在该调用结束之前,线程被阻塞。异步是一种非阻塞调用,线程继续执行其余的操作,为什么调用是单独执行的。
阻止是在Node.js中执行其他JavaScript的时间 进程必须等到非JavaScript操作完成。这个 因为事件循环无法继续运行而发生 正在进行阻塞操作时使用JavaScript。
阻止方法执行同步和非阻止方法 执行异步。
使用Async方法与同步方法
如果您调用的是像I / O操作(文件,数据库访问等)这样的大量操作,请使用异步方法,因为您不想在执行大量操作的同时阻止整个过程
但是如果它是常规调用,其结果对于其余进程的运行很重要,请使用Sync方法,其中进程将停止,直到调用完成。
如果您正在使用AWS lambda,例如,进行异步调用(将异步执行I / O操作),可能会在完成其余过程后立即终止Lambda函数。因此,确定何时使用同步调用和异步调用非常重要。
有关详细信息,请阅读以下doc。