2017-05-01 2 views
0

Hallo Ich habe einige Probleme mit async/erwarten in Nodejs. Ich würdeKnoten js async/erwarten Anfrage in Funktion

//foo.js  

    var rp = require('request-promise'); 

    function Foo(options) { 
     this.options = options; 
    } 

    function create() { 
     return new Foo(login()); 
    } 

    async function login() { 
     const options = { 
      method: `POST` 
      ,json: true 
      ,uri: `http://xxxxxx/login` 
      ,body: {username: 'abcd', password: '1234'} 
     }; 
     try { 
      const response = await rp(options); 
      return Promise.resolve(response) 
     } 
     catch (error) { 
      return Promise.reject(error); 
     } 
    } 
    module.export.create = create; 

So in dieser Art und Weise dies in meiner Fabrik verwende ich schaffen in meinem Test anrufen und ich erwarte, dass Rückkehr wird nach der Anmeldung werden ausführen, aber Fluss ist das nicht !!!

var Foo = require('foo'); 

describe('using my utils into project', function() { 

     it('using real case', function (done) { 

      var foo = Foo.create(); 
      console.log(foo.options); 
      done(); 
     }); 

    }); 

-Test mich OK zurück, aber in der Konsole sehe ich Promise { <pending> } nicht wirklich Antwort nach dem Login-Prozess. Wo ist mein Fehler? Funktioniert das richtig?

+5

Wie immer ist es nicht möglich Asynchron-Code in synchroner zu konvertieren. Nicht einmal mit async/erwarten. Das async-Schlüsselwort gibt ein Versprechen und keinen Wert zurück. Dies liegt daran, dass der Code asynchron ist und den Wert nicht in dem Moment zurückgeben kann, in dem die Funktion aufgerufen wird. Ich empfehle dringend, Versprechungen zuerst zu lernen, bevor Sie async verwenden/erwarten Sie – slebetman

+0

Ok, aber kann ich Async korrekt verwenden/erwarten? Dies ist mein Problem –

+0

@slebetman erwarten dauert ein Versprechen, und es wartet auf seinen Wert verfügbar zu sein, und gibt dann diesen Wert zurück. Ist das richtig? –

Antwort

0

Versuchen Sie, diese

//foo.js  

var rp = require('request-promise'); 

function Foo(options) { 
    this.options = options; 
} 

async function create() { 
    var temp = await login() 
    return Promise.resolve(new Foo(temp)); 
} 

function login() { 
    return new Promise(async(resolve, reject) => { 
     const options = { 
      method: `POST` 
      ,json: true 
      ,uri: `http://xxxxxx/login` 
      ,body: {username: 'abcd', password: '1234'} 
     }; 
     try { 
      const response = await rp(options); 
      return resolve(response) 
     } 
     catch (error) { 
      return reject(error); 
     } 
    }); 
} 
module.export.create = create; 

UND

async function main() { 
    var foo = await Foo.create(); 
    console.log(foo.options); 
} 

main();