等待价值异步

时间:2019-10-21 20:01:42

标签: javascript node.js asynchronous promise

此操作的基本前提是,我试图在类管理器中使用一个函数,在该值开始之前等待该值出现。我已经尝试了以下代码的所有变体,但似乎无法使其正常工作。它确实记录“发现特殊值”,因此我知道它正在返回值。为什么这不起作用?我显然不太了解异步。

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

2 个答案:

答案 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时使用更易于访问的变量测试。