可以等待/异步在javascript中阻止非阻塞进程

时间:2018-02-09 03:27:54

标签: javascript node.js async-await

我从节点

中读到这篇文章

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);

谢谢

3 个答案:

答案 0 :(得分:3)

不,代码无法运行,因为等待必须在async function中使用。

await应该用于返回promise的函数。

代码意味着:

// await new Promise(...)
// console.log(...)

new Promise().then((...) => console.log(...))

如果您应该阻止功能,则应使用fs.readFile代替。

答案 1 :(得分:0)

  

阻止意味着整个应用程序被阻止。

因此,在同步功能结束执行之前,所有SetIntervalPromiseEvents或其他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();