I'm getting used to the proposed async/await syntax and there's some unintuitive behavior. Inside the "async"
function, I can console.log
the correct string. However, when I try to return that string, instead, it returns a promise.
Checking this entry: async/await implicitly returns promise? , it's pretty clear that any "async function()"
will return a promise, NOT a value. That's fine. But how do you get access to the value? If the only answer is "a callback", that's fine - but I was hoping there might be something more elegant.
// 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"] }
I'm getting used to the proposed async/await syntax and there's some unintuitive behavior. Inside the "async"
function, I can console.log
the correct string. However, when I try to return that string, instead, it returns a promise.
Checking this entry: async/await implicitly returns promise? , it's pretty clear that any "async function()"
will return a promise, NOT a value. That's fine. But how do you get access to the value? If the only answer is "a callback", that's fine - but I was hoping there might be something more elegant.
// 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"] }
Share
Improve this question
edited May 14, 2023 at 22:55
tijko
8,32212 gold badges51 silver badges68 bronze badges
asked Feb 11, 2016 at 11:11
Brian BoykoBrian Boyko
6377 silver badges17 bronze badges
1
-
@JoachimIsaksson: Only inside an
async
function. – T.J. Crowder Commented Feb 11, 2016 at 11:20
1 Answer
Reset to default 10Yes, you only can access it using a callback:
makeHash('password').then(hash => console.log(hash));
Or of course, you can just make another async function that waits for it:
it('should generate a hash', async function(){
var hash = await makeHash('password');
console.log("inside test: ", hash);
should.exist(hash);
})
There is no way to access the result of a promise synchronously.