Метод, возвращающий обещание, выполняется не полностью, несмотря на использование ключевого слова await?
Я новичок в JavaScript и активно изучаю. Я вызываю метод, который возвращает обещание из асинхронного метода класса ES2016, используя ключевое слово await:
export default class MyClass extends Model {
async getReport() {
const value = await xlsx.save(await this._getReportFileName());
console.log('await keyword returned method value');
console.log(`The value is: ${value}`);
return true;
}
}
Может ли кто-нибудь определить причину, по которой метод выполняется до того, как у него появится возможность выполнить свою логику и до того, как будет вызвано решение. Ключевое слово await, похоже, не ожидает фактического возврата обещания, а значение, выводимое на консоль, всегда неопределено.
Объект xlsx является экземпляром класса File, который имеет метод save:
export default class File {
save(filename, options) {
writer.save(this, filename, options);
}
}
Вот код вызываемого вспомогательного метода save:
function save(xlsx, filename, options) {
return new Promise((resolve, reject) => {
try {
const stream = fs.createWriteStream(filename, options);
const zip = archiver('zip');
stream.on('close', () => {
console.log('Resolving promise');
resolve();
});
stream.on('error', (err) => {
console.log('Rejecting promise');
reject(err);
});
zip.pipe(stream);
const file1 = 'fixtures/file1.txt';
const file2 = 'fixtures/file2.txt';
zip
.append(fs.createReadStream(file1), {
name: 'file1.txt'
})
.append(fs.createReadStream(file2), {
name: 'file2.txt'
})
.finalize();
} catch (error) {
console.log('Error when saving');
reject(error);
}
});
}
Может ли быть так, что resolv () даже недоступен / недоступен для прослушивания события потока? Если да, то как можно правильно разрешить обещание во время прослушивания потокового события?
1 ответ
Ваш save(filename, options)
Сквозной метод не является асинхронным и не возвращает обещание от save(xlsx, filename, options)
метод.
Попробуй это:
export default class File {
async save(filename, options) {
await writer.save(this, filename, options);
}
}
Или это:
export default class File {
save(filename, options) {
return writer.save(this, filename, options);
}
}