我是JavaScript新手并积极学习。我正在调用一个方法,该方法使用await关键字从ES2016类的异步方法中返回一个promise:
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;
}
}
任何人都可以在有机会执行其逻辑之前和调用resolve之前发现方法执行的原因。 await关键字似乎不等待实际返回的promise,并且输出到控制台的值未定义。
对象xlsx是类File的一个实例,它有一个方法save:
export default class File {
save(filename, options) {
writer.save(this, filename, options);
}
}
以下是调用save helper方法的代码:
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);
}
});
}
是否在侦听流事件的范围内甚至无法访问/可用resolve()?如果是这样,如何在收听流事件时正确解决承诺?
答案 0 :(得分: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);
}
}