尽管使用了await关键字,但是返回promise的方法没有完全执行?

时间:2016-11-04 18:20:25

标签: javascript node.js es6-promise

我是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()?如果是这样,如何在收听流事件时正确解决承诺?

1 个答案:

答案 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);
    }
}