NodeJS中的异步与同步
Asynchronous Vs synchronous in NodeJS
我是NodeJS的新手。我看到同一任务有单独的异步和同步函数(例如:{fs.writeFile,fs.writeFileSync
},{fs.read, fs.readSync
})。
有人能解释为什么吗?有什么区别?
异步:
- 发送请求
- 继续执行其他代码
- 回拨时随时收到响应
同步:
- 发送请求
- 等待响应
- 响应后继续使用其他代码
同时拥有这些操作的同步和异步版本的原因是它们可能很耗时。由于node.js有一个单线程的主事件循环,因此在任何情况下都不希望使用慢速同步函数调用来阻塞事件循环。
这就是为什么所有事情都使用回调/承诺/期货来完成的原因。通过这种方式,您可以有一个事件循环,它只调用异步函数,并在回调中处理异步函数的结果。
这是node.js的主要优势之一,也是基本规则之一:;"不阻塞主事件循环";。
在引用node.js fs.writeFile文档时,它异步地将数据写入文件。这意味着如果你有以下代码:
1. some db operation
2. some non-related db operation
在这种情况下,第一次操作不会阻止第二次操作。第二次操作在第一次之后立即执行(无需等待完成)
然而,也有一些场景,如:
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.
Synchronous是一个阻塞调用,线程被阻塞,直到调用结束。异步是一个非阻塞调用,线程继续执行其余部分,这就是为什么调用是单独执行的。
引用NodeJS文档:
阻塞是指在Node.js中执行额外的JavaScript进程必须等待非JavaScript操作完成。这由于事件循环无法继续运行而发生在发生阻塞操作时使用JavaScript。
阻塞方法同步执行和非阻塞/strong>。
异步方法与同步方法的使用:
如果您调用的是一个扩展操作,如I/O操作(文件、数据库访问等),请使用Async方法,因为您不想在执行扩展操作时阻塞整个过程。
但是,如果它是一个常规调用,其结果对进程的其余部分起作用很重要,请使用Sync方法,在该方法中,进程将停止,直到调用完成。
例如,如果您正在使用AWS lambda,则进行异步调用(将异步执行I/O操作),可能会在进程的其余部分完成后立即终止lambda函数。因此,确定何时使用同步调用和异步调用非常重要。
有关更多信息,请阅读以下文档。
- 异步获取数据使用JavaScript同步获取数据
- javascript函数中的异步与同步.(Node.js)
- strongloop script.js run find in before delete方法:如何同步运行异步方法
- 如何模拟同步ajax调用?(基于异步的同步)
- 为什么同步睡眠功能没有被承诺内异步化
- 如何在异步函数与Deferredjquery之间同步
- 使用模态库从嵌套的异步调用中生成javascript同步代码
- 将数据发布到iframe是同步还是异步
- 节点.js / 续集.js / 快递.js - 如何插入多对多关联?(同步/异步?
- NodeJS中的异步与同步
- javascript如何成为一种同步语言并在浏览器和node.js环境中异步运行
- 如何同步2个异步瀑布
- 异步函数调用是否可以在两个同步语句之间完成
- 同步异步创建的承诺
- 同步/异步AJAX函数的模式
- 如何在 javascript 中同步异步方法
- 设置同步/异步函数序列的正确方法,所有这些函数都可以停止表单提交和进一步处理
- 浏览器呈现和javascript执行的同步/异步特性
- javascript中异步回调的结构:同步异步
- jQuery按顺序同步异步请求