【发布时间】:2021-07-10 14:08:18
【问题描述】:
我是 Node.js 的新手,正在尝试理解 async 和 await 术语。
在这个过程中,我了解了Promise。
据我了解,借助它,我们可以使函数成为非阻塞的。
我尝试了以下代码,
function get() {
return new Promise((resolve, reject) => {
setTimeout(() => {
let out = 0
const n = 9_900_000
console.log('start looping')
for (let i = 0; i < n; i++) {
out += Math.cos(i)
}
console.log('done looping')
resolve(out)
console.log('resolved')
})
})
}
console.log('before function calling')
r = get()
console.log('After function calling')
r.then(console.log)
console.log('in the end of file')
我们发现 get 的行为类似于非阻塞函数。
function get() {
return new Promise((resolve, reject) => {
let out = 0
const n = 9_900_000
console.log('start looping')
for (let i = 0; i < n; i++) {
out += Math.cos(i)
}
console.log('done looping')
resolve(out)
console.log('resolved')
})
}
console.log('before function calling')
r = get()
console.log('After function calling')
r.then(console.log)
console.log('in the end of file')
换句话说,我删除了setTimeout。
现在get 变成了一个阻塞函数。
为什么会这样?
【问题讨论】:
-
传递给 promise 构造函数的函数被同步调用。
-
Promise 不会在单独的线程或类似的线程上运行。承诺只是异步任务的通知机制。但是很多异步任务只是在同一个线程上运行。您编写的代码会阻塞线程一段时间,所以它会……阻塞线程一段时间。然后通过 Promise 发送通知。
-
JS 中没有“线程”,一旦一些同步代码(比如你的
for)开始执行,它就会一直运行到完成。与此同时,其他代码将无法运行,因为 JS 实际上是单线程的......
标签: javascript node.js asynchronous async-await