在 AngularJS 关于拦截器的文档(1.1 版)中,拦截器函数都返回类似这样的内容
return response || $q.when(response);
但是,在我的应用程序中,始终定义了“响应”,因此永远不会执行 $q.when(response)。所以问题是在什么情况下“响应”是不确定的,什么情况下?
$q.when(response) // == $q.when(null)
做!因为响应是 undefined/null ?
在 AngularJS 关于拦截器的文档(1.1 版)中,拦截器函数都返回类似这样的内容
return response || $q.when(response);
但是,在我的应用程序中,始终定义了“响应”,因此永远不会执行 $q.when(response)。所以问题是在什么情况下“响应”是不确定的,什么情况下?
$q.when(response) // == $q.when(null)
做!因为响应是 undefined/null ?
$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
的,接收 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
从这个例子中,我们返回了 Promise。所以让我们稍微改变一下:
相反return $q.when(data);
,我们将编写:
return $q.when(data) || data;
它也将起作用。但反之亦然。
据我了解,Angular 知道控制器等待Data
服务承诺,并且上述语句将使用 1st off $q.when(data)
。
演示 2Fiddle
现在让我们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)
意味着我们的服务可以返回单个值或承诺。但是既然我们知道我们的服务返回什么类型的数据,那么这个说法就没有意义了。或data
或promise
。
声明:
return config || $q.when(config);
//AND
return response || $q.when(response);
显示在拦截器文档的 V1.1 中。它已从更高版本的文档中删除。我认为记录拦截器函数可以返回值或承诺是一种错误的尝试。
否则,这些陈述毫无意义,config
并且response
总是有参考意义。