-
$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 服务承诺,上述声明将使用第一关 $q.when(data)。
演示 2 Fiddle
工厂返回数据 || $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
我的结论
return data || $q.when(data) 表示我们的服务可以返回单个值或承诺。但是既然我们知道我们的服务返回什么类型的数据,那么这个说法就没有意义了。或data 或promise。