7

在 AngularJS 关于拦截器的文档(1.1 版)中,拦截器函数都返回类似这样的内容

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

但是,在我的应用程序中,始终定义了“响应”,因此永远不会执行 $q.when(response)。所以问题是在什么情况下“响应”是不确定的,什么情况下?

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

做!因为响应是 undefined/null ?

4

2 回答 2

13
  • $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服务承诺,并且上述语句将使用 1st off $q.when(data)

演示 2Fiddle

工厂退货数据|| $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;
}]);

演示 3Fiddle

我的结论

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

于 2013-11-04T15:32:02.620 回答
1

声明:

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

//AND

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

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

否则,这些陈述毫无意义,config并且response总是有参考意义。

于 2018-12-21T11:57:14.427 回答