Javascript 何时在Angularjs中使用$q.defer()

Javascript 何时在Angularjs中使用$q.defer(),javascript,angularjs,promise,mean-stack,Javascript,Angularjs,Promise,Mean Stack,我是Angularjs的新手,我遵循以下教程:。但是,我不明白什么时候使用$q.defer()。例如,在下面的Angularjs代码中,为什么要使用$q.defer(): 服务器端代码为: router.post('/login', function(req, res, next) { passport.authenticate('local', function(err, user, info) { if (err) { return next(err); }

我是Angularjs的新手,我遵循以下教程:。但是,我不明白什么时候使用$q.defer()。例如,在下面的Angularjs代码中,为什么要使用$q.defer():

服务器端代码为:

router.post('/login', function(req, res, next) {
  passport.authenticate('local', function(err, user, info) {
    if (err) {
      return next(err);
    }
    if (!user) {
      return res.status(401).json({
        err: info
      });
    }
    req.logIn(user, function(err) {
      if (err) {
        return res.status(500).json({
          err: 'Could not log in user'
        });
      }
      res.status(200).json({
        status: 'Login successful!'
      });
    });
  })(req, res, next);
});
router.get('/status', function(req, res) {
  if (!req.isAuthenticated()) {
    return res.status(200).json({
      status: false
    });
  }
  res.status(200).json({
    status: true
  });
});
为什么不在以下Angularjs代码中使用它:

 function getUserStatus() {
      return $http.get('/user/status')
      // handle success
      .success(function (data) {
        if(data.status){
          user = true;
        } else {
          user = false;
        }
      })
      // handle error
      .error(function (data) {
        user = false;
      });
    }
服务器端代码为:

router.post('/login', function(req, res, next) {
  passport.authenticate('local', function(err, user, info) {
    if (err) {
      return next(err);
    }
    if (!user) {
      return res.status(401).json({
        err: info
      });
    }
    req.logIn(user, function(err) {
      if (err) {
        return res.status(500).json({
          err: 'Could not log in user'
        });
      }
      res.status(200).json({
        status: 'Login successful!'
      });
    });
  })(req, res, next);
});
router.get('/status', function(req, res) {
  if (!req.isAuthenticated()) {
    return res.status(200).json({
      status: false
    });
  }
  res.status(200).json({
    status: true
  });
});
$q.defer()
允许您创建一个promise对象,您可能希望该对象返回到调用您的
登录
函数的函数


确保返回
deferred.promise
而不是整个
deferred
对象,这样只有创建延迟对象的函数才能对其调用
resolve()
reject()
,但
login
的调用函数仍可以等待承诺的实现。有意义吗?

简单地说,您可以使用$q.defer()创建承诺。承诺是在将来返回单个值或错误的函数。因此,每当您有一些异步进程应该返回值或错误时,您都可以使用$q.defer()创建一个新的承诺

不过,在大多数情况下,Angular已经为您完成了这项工作,您只需使用$http服务返回的承诺即可。您的示例展示了一个很好的示例,说明您何时希望创建自己的

您可以看到,$http服务通常从服务器返回值,或者在http调用失败时返回错误。然而,在您的示例中,当http调用本身成功时,您还希望从承诺(=拒绝它)返回一个错误,但
success
属性的值不是true


为此,示例创建了一个新的承诺,然后可以手动控制其返回值(或错误)。在本例中,仅当http调用成功且具有
数据时,才调用
resolve()
(=返回值)函数。success==true
。在所有其他情况下(当http调用失败或没有正确的data.status值时),新创建的承诺将被拒绝(=返回错误)。

!不要从这个例子中学习,它使用了一个广为人知的反模式。这正是它所做的