Javascript 何时在Angularjs中使用$q.defer()
我是Angularjs的新手,我遵循以下教程:。但是,我不明白什么时候使用$q.defer()。例如,在下面的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); }
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值时),新创建的承诺将被拒绝(=返回错误)。!不要从这个例子中学习,它使用了一个广为人知的反模式。这正是它所做的