需要回调值才能在整个文件中访问

peum 发布于 2019-10-09 javascript 最后更新 2019-10-09 22:59 11 浏览

相关帖子已经存在,但我无法弄清楚如何将这些原则应用于我的情况。 我需要函数返回在回调中修改的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;
}
谢谢!
已邀请:

lvel

赞同来自:

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;
}
所以你需要做的是使用promises(首选)或传递一个在异步过程完成时执行的回调。 由于我不熟悉promises,这里有一个带回调的例子:
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主题上阅读更多内容。