我从节点
中读到这篇文章https://nodejs.org/en/docs/guides/blocking-vs-non-blocking/
它说下面的代码是一个进程阻止程序:
const fs = require('fs');
const data = fs.readFileSync('/file.md'); // blocks here until file is read
console.log(data);
// moreWork(); will run after console.log
如果我添加等待怎么办? 上面的代码会变成非阻塞的还是会保持其真实性质?
示例代码:
const fs = require('fs');
const data = await fs.readFileSync('/file.md'); // no more blocking
console.log(data);
谢谢
答案 0 :(得分:3)
不,代码无法运行,因为等待必须在async function中使用。
await应该用于返回promise的函数。
代码意味着:
// await new Promise(...)
// console.log(...)
new Promise().then((...) => console.log(...))
如果您应该阻止功能,则应使用fs.readFile
代替。
答案 1 :(得分:0)
阻止意味着整个应用程序被阻止。
因此,在同步功能结束执行之前,所有SetInterval
,Promise
,Events
或其他async callback
都会暂停。
与您使用for..loop
时获得的内容相同。
NodeJS为您提供了一些带回调的非阻塞file system
方法,只需像这样更改您的代码。
const fs = require('fs');
fs.readFile('/file.md', (err, data) => {
if (err) throw err;
console.log(data)
});
唯一的方法。
答案 2 :(得分:-1)
等待操作员等待一个诺言,并包装在异步函数中
您应该这样编码
const fs = require("fs");
function readFile(fileName) {
return new Promise((resolve, reject) => {
fs.readFile(fileName, (err, data) => {
if (err) reject(err);
resolve(data);
});
});
}
async function f1() {
try {
var x = await readFile("foo.json");
console.log(x);
} catch (e) {
console.log(e); // 30
}
}
f1();