2016-02-11 3 views
5

Ich gewöhne mich an die vorgeschlagene async/erwarten Syntax und es gibt einige nicht intuitive Verhalten. Innerhalb der "async" -Funktion kann ich die korrekte Zeichenfolge console.log. Wenn ich jedoch versuche, diese Zeichenfolge zurückzugeben, wird stattdessen ein Versprechen zurückgegeben.Wert von zurückgegebenen Versprechen von Async-Funktion

Überprüfen Sie diesen Eintrag: async/await implicitly returns promise?, ist es ziemlich klar, dass jede "async-Funktion()" wird ein Versprechen, kein Wert zurückgeben. Das ist gut. Aber wie erhalten Sie Zugang zu diesem Wert? Wenn die einzige Antwort "ein Rückruf" ist, ist das in Ordnung - aber ich hatte gehofft, dass es etwas eleganteres geben könnte.

// src 
// ========================================== 

require("babel-polyfill"); 
var bcrypt = require('bcrypt'); 

var saltAndHash = function(password){ 
    var hash; 
    return new Promise(function(resolve, reject){ 
    bcrypt.genSalt(10, function(err, salt) { 
     bcrypt.hash(password, salt, function(err, hash) { 
      resolve(hash); 
     }); 
    }); 
    }) 
} 

var makeHash = async function(password){ 
    var hash = await saltAndHash(password); 
    console.log("inside makeHash", hash); 
    return(hash); 
} 

// from test suite 
// ========================================== 

describe('Bcrypt Hashing', function(){ 

    it('should generate a hash', function(){ 
    var hash = makeHash('password'); 
    console.log("inside test: ", hash); 
    should.exist(hash); 
    }) 

}) 

// output to console: 
// ========================================== 

    inside test: Promise { 
    _d: 
    { p: [Circular], 
    c: [], 
    a: undefined, 
    s: 0, 
    d: false, 
    v: undefined, 
    h: false, 
    n: false } } 

    inside MakeHash $2a$10$oUVFL1geSONpzdTCoW.25uaI/LCnFqeOTqshAaAxSHV5i0ubcHfV6 

    // etc 
    // ========================================== 
    // .babelrc 
    { "presets": ["es2015", "stage-0", "react"] } 
+0

@JoachimIsaksson: Nur * innerhalb * einer 'async' Funktion. –

Antwort

9

Ja, man kann sie nur Zugriff auf einen Rückruf mit:

makeHash('password').then(hash => console.log(hash)); 

Oder natürlich, können Sie einfach eine andere Asynchron-Funktion machen, die für sie wartet:

it('should generate a hash', async function(){ 
    var hash = await makeHash('password'); 
    console.log("inside test: ", hash); 
    should.exist(hash); 
}) 

Es gibt Es gibt keine Möglichkeit, synchron auf das Ergebnis eines Versprechens zuzugreifen.