AngularJS延迟对象上的行为



我正在编写一个将异步执行的函数。突然,一个问题出现在我的脑海中。

假设我有以下更新学生记录的功能。

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. 如果未解决或拒绝延迟,则永远不会调用相应的处理程序
  2. 没有错误-只是不会调用链中的连续处理程序
  3. 对于SO来说过于宽泛

离题:

当您使用已经返回promise的函数(如$http)时,不需要使用$q.defer——这被称为延迟反模式。简单地return原始承诺(或使用.then创建的承诺)。

既不解决也不拒绝延迟对象有什么实际用法吗?

是的,确保从不调用链.then().catch()的任何回调。

因此,有三种可能的结果:

  • 承诺变为"已解决":承诺链遵循成功路径
  • promise变为"被拒绝":promise链遵循失败路径
  • promise仍然是"挂起的":下游不会发生任何事情,但如果(引用)promise仍然存在,并且它被解决或拒绝,则仍然可能发生

也就是说,把承诺挂在嘴边是不好的做法。你应该努力解决或拒绝。

脱离主题但相关。。。

与任何js对象一样,当promise没有引用时,它将被垃圾收集。然而,由于promise的性质,通常很难删除所有引用-它们并不总是用词法表示(在应用程序代码中)。例如,对承诺的"隐藏"引用潜伏在每个承诺链中,即使在没有明确分配的情况下也是如此。每一个承诺,无论是否用词汇表达,都会占据记忆。

回到主题。。。

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

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

就我个人而言,我觉得在这方面还需要做更多的工作。

最新更新