2017-08-08 101 views
1

我創建一個包含我的用戶憑證的解密文件,使用異步方法:如何在同步nodejs函數中等待承諾?

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();完成之前執行。我怎樣才能讓它等待呢?

+0

回報的承諾和'this.initUsers() 。然後...'? – Jorg

+0

你不能「同步等待承諾」。返回一個承諾,調用者使用'.then()'來承諾知道何時完成。 – jfriend00

+0

也許我在問錯誤的問題。而不是等待一個承諾,我可以突然擺脫諾言https://stackoverflow.com/questions/45571213/how-to-re-write-anync-function-to-be-synchronous –

回答

0

你必須做的

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

} 

你不能同步等待一個異步函數,你也可以嘗試異步/ AWAIT

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

}