无法获得函数的值

时间:2015-12-31 19:41:33

标签: javascript function asynchronous return

所以我有这个代码

>>> for i in session.execute('select id from parents limit 1'):
    print i
(147194, )
>>> p = session.query(Parent).get(147194)
>>> p == None
True
>>> c = Child()
>>> c.parent_id = 147194
>>> session.add(c)
>>> session.commit()
>>> p = session.query(Parent).get(147194)
>>> p == None
False

User.prototype.save = function (fn){ //User is just an object var password = hashPassword(null, this.pswrd); var query=client.query('INSERT INTO myUser(usrnm,pswrd)VALUES($1,$2) ,[this.name,password], function(err, result) { if(err) {console.log(err)} }); query.on("end", function (result) {client.end();}); }

版本1

hashPassword

我得到function hashPassword(salt,pass){ var salt = salt?salt:new Buffer(crypto.randomBytes(128)).toString('hex'); var pass = pass; var a=crypto.pbkdf2(pass, salt , 10000, 256, 'sha512',function(err, derivedKey) { return salt + (new Buffer(derivedKey).toString('hex')); }); return a; } apassword。我使用undifined,那么,为什么只能return取值?

第2版

a

我得到function hashPassword(salt,pass){ var salt = salt?salt:new Buffer(crypto.randomBytes(128)).toString('hex'); var pass = pass; crypto.pbkdf2(pass, salt , 10000, 256, 'sha512',function(err, derivedKey) { pass = salt + (new Buffer(derivedKey).toString('hex')); console.log("pass in > "+pass); }); console.log("pass out > "+pass); return pass; } ,但pass in > fhjvoefvuhvuoedfv... (is hashed correctly)。现在,pass out > undefinedpass来说是全局的,我在crypto中更改了它的值,为什么它不保留呢?

第3版

hashPassword

所以,我尝试通过添加额外的var来解决版本2问题,我得到function hashPassword(salt,pass){ var salt = salt?salt:new Buffer(crypto.randomBytes(128)).toString('hex'); var pass = pass; var pass2; crypto.pbkdf2(pass, salt , 10000, 256, 'sha512',function(err, derivedKey) { pass2 = salt + (new Buffer(derivedKey).toString('hex')); console.log("pass2 in > "+pass2); }); console.log("pass2 out > "+pass2); return pass2; } ,但pass2 in > fhjvoefvuhvuoedfv... (is hashed correctly)。这怎么可能?

第4版

根据第一个回答here我尝试过:

pass2 out > undefined

    var password ;
hashPassword(null, user.pswrd,function(p)
{
    password=p;
}
);

console.log("password  > "+password);

function hashPassword(salt,pass, fn){ var salt = salt?salt:new Buffer(crypto.randomBytes(128)).toString('hex'); var pass = pass; crypto.pbkdf2(pass, salt , 10000, 256, 'sha512',function(err, derivedKey) { fn(salt + (new Buffer(derivedKey).toString('hex'))); }); } password

所以,拜托,我试过,我尝试了但仍然没有,请解释并告诉我该怎么做。

由于

1 个答案:

答案 0 :(得分:0)

<ul id="my-ul" class="pager"> <li><a href="#">A</a> </li> <li><a href="#">B</a> </li> <li><a href="#">C</a> </li> <li><a href="#">D</a> </li> <li><a href="#">E</a> </li> <li><a href="#">F</a> </li> <li><a href="#">G</a> </li> <li><a href="#">H</a> </li> <li><a href="#">I</a> </li> </ul>仍然是异步功能。你应该这样使用它:

hashPassword

在回调中完成剩余的工作(回调是您传递给另一个要调用的函数的函数,读取this)。因此,如果您有一段需要初始化var password ; hashPassword(null, user.pswrd, function(p) { password=p; console.log("password > "+password); }); 的代码,请将它们放在回调中。这是password有价值时将要执行的地方。

再次阅读this thread并牢记这一点,您的功能也是异步功能。

如果在函数调用链的某处有异步函数,则整个任务变为异步。

password

当你有一个回调函数function f(callback) { function g() { function h() { function asyncFunction () { var returnValue = 'something'; callback(returnValue); } asyncFunction() } h(); } g(); } ,并且你正在调用异步函数并将回调传递给它时,你不应该期望在你的代码的其余部分之前调用你的回调。

callback

以上代码类型的日志顺序显示订单。 function f(callback) { var returnValue = 'something'; // setTimeout is to just simulate an async function setTimeout(function () { callback(returnValue); }, 0) } console.log("first log") f(function (data) { console.log("third log"); console.log(data) }); console.log("second log") 将在second log之前打印,因为third log是异步函数,稍后在结果准备好时调用回调函数,而其余代码正在执行并且没有阻止f的结果。