Javascript AngularJS V1.1拦截器在末尾总是有$q

Javascript AngularJS V1.1拦截器在末尾总是有$q,javascript,angularjs,return-value,interceptor,promise,Javascript,Angularjs,Return Value,Interceptor,Promise,在AngularJS关于拦截器的(1.1版)中,拦截器函数都返回如下内容 return response || $q.when(response); 然而,在我的应用程序中,“response”总是被定义的,所以$q.when(response)永远不会被执行。 因此,问题是在什么情况下,“响应”将是未定义的,什么将是未定义的 $q.when(response) // == $q.when(null) 做!因为响应未定义/null? $q.when(承诺)→ 承诺 $q.when(不妥协)→

在AngularJS关于拦截器的(1.1版)中,拦截器函数都返回如下内容

return response || $q.when(response);
然而,在我的应用程序中,“response”总是被定义的,所以$q.when(response)永远不会被执行。 因此,问题是在什么情况下,“响应”将是未定义的,什么将是未定义的

$q.when(response) // == $q.when(null)
做!因为响应未定义/null?

  • $q.when(承诺)
    → <代码>承诺
  • $q.when(不妥协)
    → 新的
    承诺
    ,将异步解析为给定值
    非承诺
让我们看看什么是
$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(数据) 正如我们所看到的,收到承诺或不承诺并用

工厂示例:

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");
           });
演示

工厂返回$q.when(数据)|数据 从这个例子中,我们回报承诺。让我们稍微改变一下:

而是
返回$q.when(数据)我们将编写:

return $q.when(data) || data;
它也会起作用。但反之亦然

据我所知,Angular知道控制器从
数据
服务等待,promise和上述声明将使用1st off
$q.when(Data)

演示2

工厂返回数据| |$q.when(数据) 现在让我们通过以下方式调用我们的
数据
服务:

$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

我的结论

返回数据| |$q.when(data)
意味着我们的服务可以返回单个值或承诺。但由于我们知道服务返回的数据类型,因此该语句毫无意义。或
数据
承诺
声明:

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

//AND

return response || $q.when(response);
显示在拦截器的列表中。它已从文档中删除。我认为试图证明拦截器函数可以返回值或承诺是错误的


否则,这些语句毫无意义,因为
config
response
总是有一个引用。

代码中的
response
是什么,它是承诺还是一些数据?它是来自服务器的响应。在我的拦截器中,我做了类似“response.headers('someProperty')的事情,但是$q.when(null)是什么?因为在像“return response | |$q.when(response)”这样的情况下,只有在响应为“false/undefined/null”时才能执行秒部分。据我所知,它用
$q.when
来包装它,以返回错误承诺并输入catch,我同意。考虑到返回值实际上是:“returndata | |$.when(null);”这一事实没有任何意义!是的,也许在1.5年前这是真的