2016-02-11 20 views
5

Przyzwyczaję się do proponowanej składni asynchronicznej/oczekującej i istnieje pewne nieintuicyjne zachowanie. Wewnątrz funkcji "asynchronicznej" mogę konsoli.log poprawny ciąg. Jednak gdy próbuję zwrócić ten ciąg, zamiast tego zwraca on obietnicę.Uzyskiwanie wartości z zwróconej obietnicy z funkcji asynchronicznej

Sprawdzając ten wpis: async/await implicitly returns promise?, jest całkiem jasne, że każda "funkcja asynchroniczna()" zwróci obietnicę, a NIE wartość. W porządku. Ale jak uzyskać dostęp do wartości? Jeśli jedyną odpowiedzią jest "oddzwanianie", to w porządku - ale miałem nadzieję, że może być coś bardziej eleganckiego.

// 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: Tylko * wewnątrz * jest funkcją 'asynchroniczną'. –

Odpowiedz

9

Tak, tylko do niego dostęp za pomocą callback:

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

Albo oczywiście, można po prostu zrobić inną funkcję asynchronicznej, że czeka na niego:

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

Istnieje brak możliwości synchronicznego dostępu do wyniku obietnicy.

Powiązane problemy