私はJavaScriptを初めて使っていて、積極的に学習しています。私はのawaitキーワードを使用して、ES2016クラスの非同期メソッド内から約束を返すメソッドを呼び出しています:awaitキーワードを使用しても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キーワードは、実際に返される約束を待っているようではなく、コンソールに出力される値は未定義です。
オブジェクトのxlsxは、メソッドが保存持つクラスファイルのインスタンスである:
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);
}
});
}
)それは(その解決が考えられます。ここでは
export default class File {
save(filename, options) {
writer.save(this, filename, options);
}
}
が呼び出されるヘルパーメソッドの保存のためのコードがありますストリームイベントのリスニングの範囲でアクセス可能でも利用可能でもありませんか?もしそうなら、ストリームイベントを聞いている間、どのように適切に約束を解決することができますか?
はあなたが**キーワードを待つ**とそれを呼び出す方法を示しすることはできますか? – Molda
あなたは矢印の関数に=と>の間に空白を入れているわけではありませんか?空白を持つ矢印関数を宣言しようとすると、エラーが発生する – soywod
@Molda、ここでメソッドを呼び出す方法は次のとおりです。 await xlsx.save(await this._getReportFileName()); がtrueを返します。 –