此问题已在此处有答案:
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文档上搜索同样的原因,但是没有提到异步环境中的用例。我想知道这可能是什么原因。
1条答案
按热度按时间y1aodyip1#
回调不是同步的。它们是异步的。
readFile()
和writefile()
(假设它们来自fs
模块)是异步的。因此,您试图在异步回调中分配这些变量之前,在最后一条语句中使用st1
,st2
,st3
和st4
。只是时间问题。要对异步操作进行计时和排序,必须编写适当的异步代码,使其仅在这些操作实际完成时输出结果。
由于嵌套了异步操作,因此可以移动以下代码:
在最后一个
writeFile()
回调中,如下所示:关于这段代码的一些建议:
1.使用这些函数的promise版本
fs.promises
和await
将使序列异步操作简单得多。fs.writeFile()
不会将result
传递给它的回调函数,因为没有结果,只有一个错误参数。