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

Posted

技术标签:

【中文标题】如何在同步nodejs函数中等待promise?【英文标题】:How to wait for promise in synchronous nodejs function? 【发布时间】:2018-01-15 12:11:47 【问题描述】:

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

  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...? 你不能“同步等待一个承诺”。返回一个promise,调用者在promise上使用.then()来知道它什么时候完成。 也许我问错了问题。与其等待承诺,我可以摆脱承诺***.com/questions/45571213/… 【参考方案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);
    


【讨论】:

以上是关于如何在同步nodejs函数中等待promise?的主要内容,如果未能解决你的问题,请参考以下文章

如何使单独的同步功能等待另一个异步功能?

nodejs之promise书写规范

NodeJS:等待所有带有 Promises 的 foreach 完成,但从未真正完成

promise

在 forEach 之后使用 Promise.all() 渲染 NodeJS 页面之前等待 Firebase 数据加载

Promise你把握不住?来看看异步转同步改造