AngularJS 延迟对象的行为
Behavior on AngularJS deferred object
我正在编写一个将异步执行的函数。脑子里突然冒出一个问题
假设我有以下更新学生记录的功能。
module.factory('StudentService', function($http, $q) {
var service = {};
service.updateStudent = function(studentData) {
var deferred = $q.defer();
$http.put('http://www.example.com/student/update', studentData, {
headers: { 'Content-Type': 'application/json' }
}).success(function(response) {
if (response.success) {
deferred.resolve(response.data);
} else {
// I am not resolving the deferred object here
}
}).error(function(response) {
// I am not rejecting the deferred object here
});
return deferred.promise;
};
return service;
});
我想问一下,
- 延迟的对象如果没有解决或拒绝会怎样?
- 如果延迟的对象没有被解决或拒绝,它会导致像
StudentService.updateStudent(data).then(...)
这样的链出错吗?
- 是否有既不解析也不拒绝延迟对象的实际用法?
- 如果 deferred 未被解决或拒绝,则永远不会调用相应的处理程序。
- 没有错误 - 只是不会调用链中的后续处理程序。
- 对 SO 来说太宽泛了
题外话:
当您使用已经 return 承诺(如 $http
)的函数时,您不需要使用 $q.defer
- 这称为 deferred anti-pattern。只需 return
原始承诺(或使用 .then
创建的承诺)。
Is there any practical usage of neither resolving nor rejecting a deferred object?
是的,确保链式 .then()
或 .catch()
的任何回调都不会被调用。
因此,存在三种可能的结果:
- promise 变为 "resolved":promise 链遵循成功路径。
- promise 变为 "rejected":promise 链遵循失败路径。
- promise 仍然存在 "pending":下游没有发生任何事情,但如果(引用)promise 仍然存在并且它被解决或被拒绝,则仍然可能发生。
也就是说,悬而未决是一种不好的做法。你应该努力解决或拒绝。
题外话但相关...
像任何 js 对象一样,当 没有 引用时,promise 将被垃圾收集。然而,由于 promises 的性质,删除所有引用通常非常困难——它们并不总是按词法表示(在应用程序代码中)。例如,"hidden" 对 promise(s) 的引用潜伏在每个 promise 链中,即使没有明确分配。每一个 promise,无论是否用词法表示,都会占用内存。
回到主题...
一个永远不会兑现的承诺,应该:
- 未创建(并非总是可能)
- 被删除(很少简单)
我个人觉得这方面还有很多工作要做。
我正在编写一个将异步执行的函数。脑子里突然冒出一个问题
假设我有以下更新学生记录的功能。
module.factory('StudentService', function($http, $q) {
var service = {};
service.updateStudent = function(studentData) {
var deferred = $q.defer();
$http.put('http://www.example.com/student/update', studentData, {
headers: { 'Content-Type': 'application/json' }
}).success(function(response) {
if (response.success) {
deferred.resolve(response.data);
} else {
// I am not resolving the deferred object here
}
}).error(function(response) {
// I am not rejecting the deferred object here
});
return deferred.promise;
};
return service;
});
我想问一下,
- 延迟的对象如果没有解决或拒绝会怎样?
- 如果延迟的对象没有被解决或拒绝,它会导致像
StudentService.updateStudent(data).then(...)
这样的链出错吗? - 是否有既不解析也不拒绝延迟对象的实际用法?
- 如果 deferred 未被解决或拒绝,则永远不会调用相应的处理程序。
- 没有错误 - 只是不会调用链中的后续处理程序。
- 对 SO 来说太宽泛了
题外话:
当您使用已经 return 承诺(如 $http
)的函数时,您不需要使用 $q.defer
- 这称为 deferred anti-pattern。只需 return
原始承诺(或使用 .then
创建的承诺)。
Is there any practical usage of neither resolving nor rejecting a deferred object?
是的,确保链式 .then()
或 .catch()
的任何回调都不会被调用。
因此,存在三种可能的结果:
- promise 变为 "resolved":promise 链遵循成功路径。
- promise 变为 "rejected":promise 链遵循失败路径。
- promise 仍然存在 "pending":下游没有发生任何事情,但如果(引用)promise 仍然存在并且它被解决或被拒绝,则仍然可能发生。
也就是说,悬而未决是一种不好的做法。你应该努力解决或拒绝。
题外话但相关...
像任何 js 对象一样,当 没有 引用时,promise 将被垃圾收集。然而,由于 promises 的性质,删除所有引用通常非常困难——它们并不总是按词法表示(在应用程序代码中)。例如,"hidden" 对 promise(s) 的引用潜伏在每个 promise 链中,即使没有明确分配。每一个 promise,无论是否用词法表示,都会占用内存。
回到主题...
一个永远不会兑现的承诺,应该:
- 未创建(并非总是可能)
- 被删除(很少简单)
我个人觉得这方面还有很多工作要做。