在有关拦截器的AngularJS 文档(1.1版)中,拦截器函数都返回类似以下内容
return response || $q.when(response);
但是,在我的应用程序中,始终定义了“响应”,因此从未执行$ q.when(response)。所以问题是在什么情况下“响应”是不确定的?
$q.when(response) // == $q.when(null)
做!因为响应未定义/为空?
$q.when(promise)
promise
$q.when(nonPromise)
nonPromise
让我们看看是什么$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接收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/)**
**[Fiddle](http://jsfiddle.net/9Ymvt/700/)**
从这个例子中我们返回promise。因此,让我们对其进行一些更改:
相反,return $q.when(data);我们将编写:
return $q.when(data);
return $q.when(data) || data;
它也会正常工作。但反之亦然。
据我了解,Angular知道控制器从Data服务中等待诺言,而上述语句将使用1st off $q.when(data)。
Data
$q.when(data)
演示2 **[Fiddle](http://jsfiddle.net/9Ymvt/702/)**
**[Fiddle](http://jsfiddle.net/9Ymvt/702/)**
现在,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/)**
**[Fiddle](http://jsfiddle.net/9Ymvt/703/)**
我的结论
这return data || $q.when(data)意味着我们的服务可以返回单一价值或承诺。但是,由于我们知道服务返回的数据类型,因此此语句没有意义。或data或promise。
return data || $q.when(data)
data