$q.when(promise)
→promise
$q.when(nonPromise)
→promise
指定された value に非同期的に解決されるnew 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)
サービスが単一の値または約束を返すことができることを意味します。しかし、サービスが返すデータの種類はわかっているため、このステートメントには意味がありません。またはdata
またはpromise
。