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;
});

我想问一下,

  1. 延迟的对象如果没有解决或拒绝会怎样?
  2. 如果延迟的对象没有被解决或拒绝,它会导致像 StudentService.updateStudent(data).then(...) 这样的链出错吗?
  3. 是否有既不解析也不拒绝延迟对象的实际用法?
  1. 如果 deferred 未被解决或拒绝,则永远不会调用相应的处理程序。
  2. 没有错误 - 只是不会调用链中的后续处理程序。
  3. 对 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,无论是否用词法表示,都会占用内存。

回到主题...

一个永远不会兑现的承诺,应该:

  • 未创建(并非总是可能)
  • 被删除(很少简单)

我个人觉得这方面还有很多工作要做。