我对nodejs是新手。我已经看到,对于同一个任务,有单独的异步和同步功能(例如:{ fs.writeFile,fs.writeFileSync } , { fs.read, fs.readSync }).有人能解释为什么会这样吗?有什么区别?
fs.writeFile,fs.writeFileSync
fs.read, fs.readSync
tktrz96b1#
异步:发送请求继续使用其他代码任何时候都可以通过回调进行响应同步:发送请求等待回应响应后继续执行其他代码
gmxoilav2#
同时拥有这些操作的同步和异步验证的原因是它们可能很耗时。由于node.js有一个单线程主事件循环,因此在任何情况下都不希望使用缓慢的同步函数调用来阻止事件循环。这就是为什么一切都是用回调/承诺/未来来完成的。通过这种方式,您可以拥有一个事件循环,该循环只调用异步函数,并在回调中处理异步函数的结果(当它碰巧完成时)。这是node.js的主要优点之一,也是基本规则之一:“不要阻止主事件循环”。
tkclm6bt3#
参考node.js fs.writefile doc,它将数据异步写入文件。这意味着如果您有以下代码:
1. some db operation 2. some non-related db operation
在这种情况下,第一次操作不会阻止第二次操作。第二次操作在第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。
pvcm50d14#
synchronous是一个阻塞调用,在该调用结束之前线程一直被阻塞。异步是一种非阻塞调用,其中线程继续执行其余调用,这就是为什么单独执行调用。引用nodejs文件:阻塞是指node.js进程中附加javascript的执行必须等待非javascript操作完成。发生这种情况是因为在发生阻塞操作时,事件循环无法继续运行javascript。阻塞方法同步执行,非阻塞方法异步执行。异步方法与同步方法的使用:如果调用是一个扩展操作,如i/o操作(文件、数据库访问等),请使用异步方法,因为您不希望在执行扩展操作时阻塞整个进程。但是如果它是一个常规调用,而调用的结果对进程的其余部分的运行很重要,那么请使用同步方法,在同步方法中进程将停止,直到调用完成。例如,如果使用aws lambda,则进行异步调用(将异步执行i/o操作)可能会在进程的其余部分完成后立即终止lambda函数。因此,确定何时使用同步调用和异步调用非常重要。有关更多信息,请阅读以下文档。
4条答案
按热度按时间tktrz96b1#
异步:
发送请求
继续使用其他代码
任何时候都可以通过回调进行响应
同步:
发送请求
等待回应
响应后继续执行其他代码
gmxoilav2#
同时拥有这些操作的同步和异步验证的原因是它们可能很耗时。由于node.js有一个单线程主事件循环,因此在任何情况下都不希望使用缓慢的同步函数调用来阻止事件循环。
这就是为什么一切都是用回调/承诺/未来来完成的。通过这种方式,您可以拥有一个事件循环,该循环只调用异步函数,并在回调中处理异步函数的结果(当它碰巧完成时)。
这是node.js的主要优点之一,也是基本规则之一:“不要阻止主事件循环”。
tkclm6bt3#
参考node.js fs.writefile doc,它将数据异步写入文件。这意味着如果您有以下代码:
在这种情况下,第一次操作不会阻止第二次操作。第二次操作在第1次之后立即执行(无需等待完成)
但是,也有一些场景,如:
然后使用fs.writefilesync。
pvcm50d14#
synchronous是一个阻塞调用,在该调用结束之前线程一直被阻塞。异步是一种非阻塞调用,其中线程继续执行其余调用,这就是为什么单独执行调用。
引用nodejs文件:
阻塞是指node.js进程中附加javascript的执行必须等待非javascript操作完成。发生这种情况是因为在发生阻塞操作时,事件循环无法继续运行javascript。
阻塞方法同步执行,非阻塞方法异步执行。
异步方法与同步方法的使用:
如果调用是一个扩展操作,如i/o操作(文件、数据库访问等),请使用异步方法,因为您不希望在执行扩展操作时阻塞整个进程。
但是如果它是一个常规调用,而调用的结果对进程的其余部分的运行很重要,那么请使用同步方法,在同步方法中进程将停止,直到调用完成。
例如,如果使用aws lambda,则进行异步调用(将异步执行i/o操作)可能会在进程的其余部分完成后立即终止lambda函数。因此,确定何时使用同步调用和异步调用非常重要。
有关更多信息,请阅读以下文档。