如何在同步nodejs函数中等待promise?

How to wait for promise in synchronous nodejs function?

提问人:Dingredient 提问时间:8/8/2017 更新时间:11/22/2023 访问量:8909

问:

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

  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();

node.js 异步 回调 承诺 async-await

评论

0赞 Jorg 8/8/2017
返回 promise 和 ?this.initUsers().then...
1赞 jfriend00 8/8/2017
你不能“同步等待承诺”。返回一个 promise,调用方使用该 promise 来知道它何时完成。.then()
0赞 Dingredient 8/8/2017
也许我问错了问题。与其等待承诺,不如摆脱承诺 stackoverflow.com/questions/45571213/......

答:

0赞 marvel308 8/8/2017 #1

你必须这样做

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

}