【问题标题】:AngularJS V1.1 interceptor always have $q.when at the endAngularJS V1.1 拦截器最后总是有 $q.when
【发布时间】:2013-11-04 15:17:52
【问题描述】:

在AngularJS关于拦截器的documentation(1.1版)中,拦截器函数都返回类似这样的东西

return response || $q.when(response);

但是,在我的应用中,“响应”总是被定义,所以 $q.when(response) 永远不会被执行。 所以问题是在什么情况下“响应”是未定义的,什么情况

$q.when(response) // == $q.when(null)

做!因为响应是未定义/空的?

【问题讨论】:

  • 你的代码中的response是什么,是承诺还是一些数据?
  • 这是来自服务器的响应。在我的拦截器中,我执行“response.headers('someProperty)”之类的操作

标签: javascript angularjs return-value interceptor promise


【解决方案1】:
  • $q.when(promise)promise
  • $q.when(nonPromise) → 一个新的promise,它将异步解析为给定值nonPromise

让我们看看$q.when是什么:

$q.when = function (foreignPromise) {
    var deferred = $q.defer();
    foreignPromise.then(function (data) {
        deferred.resolve(data);
        $rootScope.$digest();
    }, function (reason) {
        deferred.reject(reason);
        $rootScope.$digest();
    });
    return deferred.promise;
}

工厂返回 $q.when(data)

正如我们所见,$q.when 接收到 promise 或 nonPromise 并将其包装起来。

工厂示例:

fessmodule.factory('Data', ['$resource','$q',  function($resource, $q) {
    var data = [
        {
            "PreAlertInventory": "5.000000",
            "SharesInInventory": "3.000000",
            "TotalSharesSold": "2.000000",
            "TotalMoneySharesSold": "18.000000",
            "TotalSharesBought": "0.000000",
            "TotalShareCost": "0.000000",
            "EstimatedLosses": "0.000000"
        }
    ]; 

    var factory = {
        query: function (selectedSubject) {                             
            return $q.when(data);
        }    
    }
    return factory;
}]); 

现在我们可以从控制器调用它了:

Data.query()
           .then(function (result) {
               $scope.data = result;                           
           }, function (result) {
               alert("Error: No data returned");
           });

演示Fiddle

工厂返回 $q.when(data) ||数据

在这个例子中,我们返回了 Promise。所以让我们稍微改变一下:

我们将改为return $q.when(data);

return $q.when(data) || data;

它也会起作用。但反之亦然。

据我了解,Angular 知道控制器等待 Data 服务承诺,上述声明将使用第一关 $q.when(data)

演示 2 Fiddle

工厂返回数据 || $q.when(数据)

现在让我们通过这种方式调用我们的Data 服务:

$scope.data =  Data.query();

没有承诺,通话是同步的。

工厂看起来像:

fessmodule.factory('Data', ['$resource','$q',  function($resource, $q) {
    var data = [
        {
            "PreAlertInventory": "5.000000",
            "SharesInInventory": "3.000000",
            "TotalSharesSold": "2.000000",
            "TotalMoneySharesSold": "18.000000",
            "TotalSharesBought": "0.000000",
            "TotalShareCost": "0.000000",
            "EstimatedLosses": "0.000000"
        }
    ]; 

    var factory = {
        query: function (selectedSubject) {                             
            return  data || $q.when(data);
        }
    }
    return factory;
}]);

演示 3 Fiddle

我的结论

return data || $q.when(data) 表示我们的服务可以返回单个值或承诺。但是既然我们知道我们的服务返回什么类型的数据,那么这个说法就没有意义了。或datapromise

【讨论】:

  • 但是什么是 $q.when(null) ?因为在'return response || 这样的情况下$q.when(response)' 只有在 response 为 'false/undefined/null 时才能执行秒部分。
  • 据我所知,它用$q.when 包装它以返回错误承诺并输入捕获
  • 我同意。并考虑到返回值实际上是:“返回数据 || $.when(null);”没有任何意义!
  • 是的,可能在 1.5 年之前它是实际的
【解决方案2】:

声明:

return config || $q.when(config);

//AND

return response || $q.when(response);

显示在V1.1 of the Documentation 的拦截器中。它已从文档的later versions 中删除。我认为记录拦截器函数可以返回值或承诺是一种错误的尝试。

否则这些陈述毫无意义,因为 configresponse 总是有参考。

【讨论】:

    猜你喜欢
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    • 2014-11-28
    • 1970-01-01
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    相关资源
    最近更新 更多