async / await возвращает Promise {<pending>} - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь создать функцию, которая читает файл и возвращает хэш, и который может использоваться синхронно.

export async function hash_file(key) {
    // open file stream
    const fstream = fs.createReadStream("./test/hmac.js");
    const hash = crypto.createHash("sha512", key);
    hash.setEncoding("hex");

    // once the stream is done, we read the values
    let res = await readStream.on("end", function() {
        hash.end();
        // print result
        const res = hash.read();
        return res;
    });

    // pipe file to hash generator
    readStream.pipe(hash);

    return res;
}

Кажется, я неправильно размещаю ключевое слово await ...

1 Ответ

0 голосов
/ 08 июня 2018

Если значение выражения, следующего за оператором ожидания, не является Обещанием, оно преобразуется в разрешенное Обещание.

readStream.on не возвращает обещание, поэтому ваш кодне будет работать так, как вы ожидаете.

Вместо использования await оберните readStream.on внутри Promise и resolve, когда он закончится.

function hash_file(key) {
    // open file stream
    const readStream = fs.createReadStream("./foo.js");
    const hash = crypto.createHash("sha512", key);
    hash.setEncoding("hex");

    // once the stream is done, we read the values
    return new Promise((resolve, reject) => {
        readStream.on("end", () => {
            hash.end();
            // print result
            resolve(hash.read());
        });

        readStream.on("error", reject);

        // pipe file to hash generator
        readStream.pipe(hash);
    });
}

Я пытаюсь создать функцию, которая читает файл и возвращает хэш и , которые можно использовать синхронно

Этого не произойдет, никогда.Вы не можете сделать асинхронный код синхронным.Вы можете сделать так, чтобы он выглядел синхронно, используя async/await, но он всегда будет асинхронным.

(async() => {
    const hash = await hash_file('my-key'); // This is async.
    console.log(hash);
})();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...