如何在变量中保存异步返回值?

时间:2017-11-14 16:28:43

标签: javascript asynchronous

var bcrypt = require('bcryptjs');
var password = "Bacon";
var securePassword;
bcrypt.genSalt(10, function(err, salt) {
    bcrypt.hash(bacon, salt, function(err, hash) {
        securePassword = hash
    });
});
console.log(securePassword)

这可能会因Async而返回 undefined 。如何将哈希值存储在变量securePassword?

3 个答案:

答案 0 :(得分:1)

您正在securePassword回调函数中将哈希值存储到bcrypt.hash这是正确的..但是因为这是一个回调函数,您的console.log将在securePassword之前执行分配..

解决方法是在回调句柄中执行逻辑。

您还可以使用承诺之类的不同方法来解决它,您可以从MDN

中阅读更多内容



var bcrypt = require('bcryptjs');
var password = "Bacon";
var securePassword;
bcrypt.genSalt(10, function(err, salt) {
    bcrypt.hash(bacon, salt, function(err, hash) {
        securePassword = hash
        dologic()
        //console.log(securePassword)
        //or have a function with this statement
    });
});
function dologic(){
console.log(securePassword)
}




答案 1 :(得分:0)

您正在处理asynchronous功能。

不可

var securePassword;

bcrypt.genSalt(10, function(err, salt) {
    if (err) return callback(err);

    bcrypt.hash(bacon, salt, function(err, hash) {
        securePassword = hash;

        console.log(securePassword);
    });
});

不可

function generateSalt(callback) {
    bcrypt.genSalt(10, function(err, salt) {
        bcrypt.hash(bacon, salt, callback);
    });
}

generateSalt((err, hash) => {
  if (err) // Handle error

  console.log(hash);
});

答案 2 :(得分:-1)

您可以等到此变量为非null。例如,以这种方式:

var bcrypt = require('bcryptjs');
var password = "Bacon";
var securePassword = NULL;
var interval = NULL;
bcrypt.genSalt(10, function(err, salt) {
    bcrypt.hash(bacon, salt, function(err, hash) {
        securePassword = hash
    });
});

interval = setInterval(function() {
    if(securePassword !== NULL) {
        console.log(securePassword);
        clearInterval(interval);
    }
}, 1);