2016-02-11 21 views
5

Önerilen async/await sözdizimine alıyorum ve bazı mantıksız davranışlar var. "Eşzamansız" işlevinin içinde, doğru dizeyi konsolide edebilirim. Ancak, bu dizeyi döndürmeye çalıştığımda, bunun yerine bir söz verir.Async işlevinden döndürülen sözden değer alma

Bu girdiyi kontrol etmek: async/await implicitly returns promise?, herhangi bir "async function()" ın bir söz, bir değer vermeyeceği oldukça açıktır. Bu iyi. Ama bu değere nasıl erişiyorsunuz? Tek cevap "geri arama" ise, bu iyi - ama daha zarif bir şey olabileceğini umuyordum.

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

Ya elbette, sadece bunun için bekler başka zaman uyumsuz işlevi yapabilir:

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

yoktur

// 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: Yalnızca * iç * bir "async" işlevi. –

cevap

9

Evet, sadece bir geri arama kullanarak erişebilir Bir sözün sonucuna senkronize olarak erişmenin yolu yoktur.

İlgili konular