Метод, возвращающий обещание, выполняется не полностью, несмотря на использование ключевого слова 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);
    }
}
Другие вопросы по тегам