我正在编写一个将异步执行的函数。突然,一个问题出现在我的脑海中。
假设我有以下更新学生记录的功能。
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(...)
这样的链出错 - 既不解决也不拒绝延迟对象有什么实际用法吗
- 如果未解决或拒绝延迟,则永远不会调用相应的处理程序
- 没有错误-只是不会调用链中的连续处理程序
- 对于SO来说过于宽泛
离题:
当您使用已经返回promise的函数(如$http
)时,不需要使用$q.defer
——这被称为延迟反模式。简单地return
原始承诺(或使用.then
创建的承诺)。
既不解决也不拒绝延迟对象有什么实际用法吗?
是的,确保从不调用链.then()
或.catch()
的任何回调。
因此,有三种可能的结果:
- 承诺变为"已解决":承诺链遵循成功路径
- promise变为"被拒绝":promise链遵循失败路径
- promise仍然是"挂起的":下游不会发生任何事情,但如果(引用)promise仍然存在,并且它被解决或拒绝,则仍然可能发生
也就是说,把承诺挂在嘴边是不好的做法。你应该努力解决或拒绝。
脱离主题但相关。。。
与任何js对象一样,当promise没有引用时,它将被垃圾收集。然而,由于promise的性质,通常很难删除所有引用-它们并不总是用词法表示(在应用程序代码中)。例如,对承诺的"隐藏"引用潜伏在每个承诺链中,即使在没有明确分配的情况下也是如此。每一个承诺,无论是否用词汇表达,都会占据记忆。
回到主题。。。
一个永远不会兑现的承诺,也应该:
- 无法创建(并非总是可能的)
- 被删除(很少是简单的)
就我个人而言,我觉得在这方面还需要做更多的工作。