2016-02-11 1 views
5

Je m'habitue à la syntaxe async/await proposée et il y a un comportement non intuitif. A l'intérieur de la fonction "async", je peux consoler.log la chaîne correcte. Toutefois, lorsque j'essaie de renvoyer cette chaîne, elle renvoie une promesse.Récupération de la valeur de la promesse renvoyée par la fonction async

En cochant cette entrée: async/await implicitly returns promise?, il est évident que "async function()" retournera une promesse, PAS une valeur. C'est très bien. Mais comment avez-vous accès à la valeur? Si la seule réponse est "un rappel", c'est bien - mais j'espérais qu'il pourrait y avoir quelque chose de plus élégant.

// 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: Seulement * dans * une fonction 'async'. –

Répondre

9

Oui, vous ne pouvez accéder à l'aide d'un rappel:

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

Ou bien sûr, vous pouvez simplement faire une autre fonction async qui l'attend:

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

Il est aucun moyen d'accéder au résultat d'une promesse de manière synchrone.