何时在 Angularjs 中使用 $q.defer()
when to use $q.defer() in Angularjs
我是 Angularjs 的新手,我正在学习本教程:http://mherman.org/blog/2015/07/02/handling-user-authentication-with-the-mean-stack/#.WE70iubhCM8。但是我不明白什么时候使用 $q.defer()。例如在下面的 Angularjs 代码中为什么要使用 $q.defer() :
function login(username, password) {
// create a new instance of deferred
var deferred = $q.defer();
// send a post request to the server
$http.post('/user/login',
{username: username, password: password})
// handle success
.success(function (data, status) {
if(status === 200 && data.status){
user = true;
deferred.resolve();
} else {
user = false;
deferred.reject();
}
})
// handle error
.error(function (data) {
user = false;
deferred.reject();
});
服务器端代码是:
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);
});
为什么不在以下 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.get('/status', function(req, res) {
if (!req.isAuthenticated()) {
return res.status(200).json({
status: false
});
}
res.status(200).json({
status: true
});
});
$q.defer()
允许您创建一个承诺对象,您可能希望将其 return 到调用您的 login
函数的函数。
确保 return deferred.promise
而不是整个 deferred
对象,这样只有创建延迟对象的函数才能调用 resolve()
或 reject()
就可以了,但是 login
的调用函数仍然可以等待 promise 完成。有道理吗?
简单地说,你可以使用 $q.defer() 来创建一个 Promise。 Promise 是一个 函数,它 return 是未来的单个值或错误 。所以每当你有一些异步进程应该 return 一个值或一个错误时,你可以使用 $q.defer() 来创建一个新的 Promise。
但在大多数情况下,Angular 已经为您完成了此操作,您可以简单地使用 returned 的 Promise,例如 $http 服务。您的示例很好地说明了您何时想要创建自己的示例。
你看,通常 $http 服务 returns 来自服务器的值,或者当 http 调用失败时出现错误。然而,在您的示例中,当 http 调用自身成功时,您还希望 return 来自 Promise 的错误(= 拒绝它),但 success
属性 的值不正确。
为此,示例创建了一个新的 Promise,然后可以手动控制其 return 值(或错误)。在这个例子中通过调用resolve()
(=return的值)函数只有当http调用成功并且有data.success == true
时。在所有其他情况下(当 http 调用失败或没有正确的 data.status 值时)新创建的 Promise 将被拒绝(= return 错误)。
我是 Angularjs 的新手,我正在学习本教程:http://mherman.org/blog/2015/07/02/handling-user-authentication-with-the-mean-stack/#.WE70iubhCM8。但是我不明白什么时候使用 $q.defer()。例如在下面的 Angularjs 代码中为什么要使用 $q.defer() :
function login(username, password) {
// create a new instance of deferred
var deferred = $q.defer();
// send a post request to the server
$http.post('/user/login',
{username: username, password: password})
// handle success
.success(function (data, status) {
if(status === 200 && data.status){
user = true;
deferred.resolve();
} else {
user = false;
deferred.reject();
}
})
// handle error
.error(function (data) {
user = false;
deferred.reject();
});
服务器端代码是:
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);
});
为什么不在以下 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.get('/status', function(req, res) {
if (!req.isAuthenticated()) {
return res.status(200).json({
status: false
});
}
res.status(200).json({
status: true
});
});
$q.defer()
允许您创建一个承诺对象,您可能希望将其 return 到调用您的 login
函数的函数。
确保 return deferred.promise
而不是整个 deferred
对象,这样只有创建延迟对象的函数才能调用 resolve()
或 reject()
就可以了,但是 login
的调用函数仍然可以等待 promise 完成。有道理吗?
简单地说,你可以使用 $q.defer() 来创建一个 Promise。 Promise 是一个 函数,它 return 是未来的单个值或错误 。所以每当你有一些异步进程应该 return 一个值或一个错误时,你可以使用 $q.defer() 来创建一个新的 Promise。
但在大多数情况下,Angular 已经为您完成了此操作,您可以简单地使用 returned 的 Promise,例如 $http 服务。您的示例很好地说明了您何时想要创建自己的示例。
你看,通常 $http 服务 returns 来自服务器的值,或者当 http 调用失败时出现错误。然而,在您的示例中,当 http 调用自身成功时,您还希望 return 来自 Promise 的错误(= 拒绝它),但 success
属性 的值不正确。
为此,示例创建了一个新的 Promise,然后可以手动控制其 return 值(或错误)。在这个例子中通过调用resolve()
(=return的值)函数只有当http调用成功并且有data.success == true
时。在所有其他情况下(当 http 调用失败或没有正确的 data.status 值时)新创建的 Promise 将被拒绝(= return 错误)。