javascript 为什么performance.now()在nodejs的同步回调函数中不起作用[重复]

ecfdbz9o  于 2023-06-20  发布在  Java
关注(0)|答案(1)|浏览(117)

此问题已在此处有答案

Why is my variable unaltered after I modify it inside of a function? - Asynchronous code reference(7个回答)
3天前关闭。
我尝试在nodejs中运行异步读写,并尝试使用www.example.com测量执行时间perfomance.now。但在回调函数中,performance.now给了我undefined。

const { performance } = require("perf_hooks");

var st1 = performance.now();
console.log("start");
var st2, st3, st4, st5;
const { readFile, writeFile } = require("fs");
console.log("middle");
readFile("./content/first.txt", "utf-8", (err, result) => {
  if (err) {
    console.log(err);
    return;
  }
  const first = result;
  st2 = performance.now();

  readFile("./content/second.txt", "utf-8", (err, result) => {
    if (err) {
      console.log(err);
      return;
    }
    const second = result;
    st3 = performance.now();

    writeFile(
      "./content/result-async.text",
      `Here is the result : ${first}: ${second}`,
      (err, result) => {
        if (err) {
          console.log(err);
          return;
        }
        console.log(result);
        console.log("after result");
        st4 = performance.now();
      }
    );
  });
});
console.log("end");
console.log("after end");
st5 = performance.now();
console.log(`st1=${st1},st2=${st2},st3=${st3},st4=${st4},st5=${st5}`);

下面是上面的结果

start
middle
end
after end
st1=50.264651000499725,st2=undefined,st3=undefined,st4=undefined,st5=56.36346299946308
undefined
after result

我不明白st2,st3和st4未定义的原因。??
我试着在mdn文档上搜索同样的原因,但是没有提到异步环境中的用例。我想知道这可能是什么原因。

y1aodyip

y1aodyip1#

回调不是同步的。它们是异步的。readFile()writefile()(假设它们来自fs模块)是异步的。因此,您试图在异步回调中分配这些变量之前,在最后一条语句中使用st1st2st3st4。只是时间问题。
要对异步操作进行计时和排序,必须编写适当的异步代码,使其仅在这些操作实际完成时输出结果。
由于嵌套了异步操作,因此可以移动以下代码:

console.log("end");
console.log("after end");
st5 = performance.now();
console.log(`st1=${st1},st2=${st2},st3=${st3},st4=${st4},st5=${st5}`);

在最后一个writeFile()回调中,如下所示:

const { performance } = require("perf_hooks");

var st1 = performance.now();
console.log("start");
var st2, st3, st4, st5;
const { readFile, writeFile } = require("fs");
console.log("middle");
readFile("./content/first.txt", "utf-8", (err, result) => {
    if (err) {
        console.log(err);
        return;
    }
    const first = result;
    st2 = performance.now();

    readFile("./content/second.txt", "utf-8", (err, result) => {
        if (err) {
            console.log(err);
            return;
        }
        const second = result;
        st3 = performance.now();

        writeFile(
            "./content/result-async.text",
            `Here is the result : ${first}: ${second}`,
            (err) => {
                if (err) {
                    console.log(err);
                    return;
                }
                st4 = performance.now();
                console.log("end");
                console.log("after end");
                st5 = performance.now();
                console.log(`st1=${st1},st2=${st2},st3=${st3},st4=${st4},st5=${st5}`);
            }
        );
    });
});

关于这段代码的一些建议:
1.使用这些函数的promise版本fs.promisesawait将使序列异步操作简单得多。

  1. fs.writeFile()不会将result传递给它的回调函数,因为没有结果,只有一个错误参数。

相关问题