此操作的基本前提是,我试图在类管理器中使用一个函数,在该值开始之前等待该值出现。我已经尝试了以下代码的所有变体,但似乎无法使其正常工作。它确实记录“发现特殊值”,因此我知道它正在返回值。为什么这不起作用?我显然不太了解异步。
async function getValue (file) {
let specialI = false;
fs.readFile(file, 'utf8', (err, fileContents) => {
for (let i in data) {
if (data[i] === GOOD) {
specialI = true;
}
}
if (specialI) {
console.log("Special value found!");
return data[specialI];
} else {
return false;
}
}
}
class manager() {
async waitForSpecial() {
let value;
value = await getValue("file.json");
if (value) {
console.log("Wow it worked!");
} else {
console.log("Still no value...");
await sleep(500);
this.waitForSpecial();
}
}
}
答案 0 :(得分:1)
您不会从“ getValue”返回任何内容,因此当您使用await
await getValue("file.json")
对其进行解析时,它不会立即解决任何问题
然后它可能会在打印Special value found!
之后立即打印Still no value
您还需要通过将readFile调用封装在Promise中来等待fs.readFile
结果:
async function getValue(file) {
let specialI = false;
return await new Promise((resolve, reject) => {
fs.readFile(file, 'utf8', (err, fileContents) => {
for (let i in data) {
if (data[i] === GOOD) {
specialI = true;
}
}
if (specialI) {
console.log("Special value found!");
resolve(data[specialI]);
} else {
resolve(false);
}
})
});
}
class manager {
async waitForSpecial() {
let value;
value = await getValue("file.json");
if (value) {
console.log("Wow it worked!");
} else {
console.log("Still no value...");
await sleep(500);
this.waitForSpecial();
}
}
}
答案 1 :(得分:-1)
由于它是异步的,因此它永远不会等待值继续执行。 最好将所有异步内容都写在一起……
如果必须这样做,那么我建议您尝试在while块中使用一个标志,尽管它杀死了异步的概念,或者尝试在null时使用更易于访问的变量测试。