2017-04-23 47 views
0

相關帖子已經存在,但我無法弄清楚如何將原則應用於我的情況。需要回撥的價值可在整個文件中訪問

我需要函數返回在回調中修改的returnVal(顯然不工作 - 每次都返回false)。

任何想法?

function login(user){ 
    var returnVal = false; 
    User.findOne({username: user.username}, function (err, res){ 
    res.comparePassword(user.password, function(err, isMatch) { 
     if (err) throw err; 
     if(isMatch){ 
     returnVal = true; 
     } 
    }); 
    }); 
    return returnVal; 
} 

謝謝!

+0

請參閱http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call – guest271314

+0

停止嘗試解決錯誤的問題。而不是試圖返回你需要的值(它是異步加載的),將需要該值的函數作爲參數傳遞給'function login(user,callback){...}'並將其用作回調函數,如'回調(returnVal)'內部的函數(err,isMatch){...}'結尾。 –

回答

0
function login(user){ 
    var returnVal = false; 
    // vvv-- This gets executed asynchronously --vvv 
    User.findOne({username: user.username}, function (err, res){ 
    res.comparePassword(user.password, function(err, isMatch) { 
     if (err) throw err; 
     if(isMatch){ 
     returnVal = true; 
     } 
    }); 
    }); 
    return returnVal; 
} 

所以你需要做的是要麼使用承諾(首選)或通過在當異步過程完成後,其得到執行的回調。

由於我不熟悉的承諾,這裏用一個回調的例子:

function login(user, callback) { 
    // This gets executed asynchronously 
    User.findOne({username: user.username}, function (err, res) { 
    res.comparePassword(user.password, function(err, isMatch) { 
     if (err) throw err; 
     // Invoke the callback 
     callback(isMatch); 
    }); 
    }); 
} 

用法:

login({user: '...', pass: 'secret'}, function(returnVal) { 
    console.log('login() returned ' + returnVal) 
}) 

邊注:承諾是因爲所謂的回調地獄較受歡迎。

您可以在主題here上閱讀更多內容。

+0

非常感謝你,這正是我無法理解的 –