如何在同步的Node.js函数中等待Promise?

7
我使用异步方法创建了一个包含用户凭据的解密文件:
  initUsers(){

    // decrypt users file
    var fs = require('fs');
    var unzipper = require('unzipper');

    unzipper.Open.file('encrypted.zip')
            .then((d) => {
                return new Promise((resolve,reject) => {
                    d.files[0].stream('secret_password')
                        .pipe(fs.createWriteStream('testusers.json'))
                        .on('finish',() => { 
                            resolve('testusers.json'); 
                        });
                });
            })
            .then(() => {
                 this.users = require('./testusers');

            });

  },

我从同步方法中调用该函数。然后我需要等待它完成后,同步方法才能继续执行。

doSomething(){
    if(!this.users){
        this.initUsers();
    }
    console.log('the users password is: ' + this.users.sample.pword);
}

console.logthis.initUsers();完成之前执行。我该如何使其等待?


返回承诺和this.initUsers().then...吗? - Jorg
1
你不能“同步等待一个Promise”。返回一个Promise,调用者使用.then()在Promise完成时得知它已经完成。 - jfriend00
也许我问错了问题。我是否可以摆脱 Promise,而不是等待 Promise?https://stackoverflow.com/questions/45571213/how-to-re-write-anync-function-to-be-synchronous - Dingredient
1个回答

0

你需要做的是

doSomething(){
    if(!this.users){
        this.initUsers().then(function(){
            console.log('the users password is: ' + this.users.sample.pword);
        });
    }

}

你不能同步等待异步函数,你可以尝试使用async/await

async function doSomething(){
    if(!this.users){
        await this.initUsers()
        console.log('the users password is: ' + this.users.sample.pword);
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接