一尘不染

AngularJS V1.1拦截器始终在末尾带有$ q。

angularjs

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

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

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

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

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


阅读 184

收藏
2020-07-04

共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(数据)

如我们所见,$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](http://jsfiddle.net/9Ymvt/700/)**

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

从这个例子中我们返回promise。因此,让我们对其进行一些更改:

相反,return $q.when(data);我们将编写:

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

它也会正常工作。但反之亦然。

据我了解,Angular知道控制器从Data服务中等待诺言,而上述语句将使用1st off $q.when(data)

演示2 **[Fiddle](http://jsfiddle.net/9Ymvt/702/)**

工厂返回数据|| $ 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](http://jsfiddle.net/9Ymvt/703/)**

我的结论

return data || $q.when(data)意味着我们的服务可以返回单一价值或承诺。但是,由于我们知道服务返回的数据类型,因此此语句没有意义。或datapromise

2020-07-04