私はエミュレートするべきです。
-
20-12-2019 - |
質問
AngularJSを使った管理アプリケーションに取り組んでいます。アプリは$ RESOURCEを使用してサーバーからデータを取り出します。データがフェッチされたかを判断するには、[$ PROSSION]プロパティを含むデータオブジェクトになります。 すべてが大丈夫です。
今、この管理者アプリは新しいオブジェクトを作成することもできます。これらの新しいオブジェクトは、通常 '$ RESOURCE'から来るものと同じコントローラによって管理されます。
だから私は2種類のオブジェクトを持っています:
- $ PROMISSプロパティを持つオブジェクト。完全なデータで操作する前に$ PROSSSE.THEN()を使用する必要があります
- プレーンオブジェクト。彼らは$ Promiseプロパティを持っていません、彼らの価値は即座に にアクセス可能です
コードを縮小し、オブジェクトデータが解決されているかどうかを確認する必要がない、またはそれが約束でなければ、単一のユースケースを持つことを望みます。
彼らに「$ Promise」プロパティを追加することで、私の「普通」オブジェクトを構築することに問題はありますか?そのように、私はいつも「MyObject.Then()」を使うでしょう。
この状況を処理する一般的なパターンはありますか?角度を持つこの種のオブジェクトを作成するための「標準」メソッドが見つかりませんでした。
解決
$ Q. オブジェクトには約束があります。
(obj.$promise ? obj.$promise || $q.when(objResult)).then(function(result){
//handle success case.
//Incase of object not having the $promise property result will be object itself
})
.
結果として得られる財産に約束がない場合、これは約束で解決されます。
価値または(第三者)である可能性があるオブジェクトを$ Q約束に包む。これはあなたが約束されているかもしれないか、約束されないかもしれないオブジェクトを扱っているとき、あるいは信頼できないソースから来た場合に役立ちます。
常に約束を作成して転送されているデータに添付する必要はありませんが、代わりにあなたのメソッドが約束を返すことができ、あなたが約束パターンを実装し、あなたのサービス自体の約束ロジックを抽象化させることができます。例: -
function getCurrentUserData(userId){
var defered = $q.defer();
...
//Check in my cache if this is already there, then get it from cache and resolve it
defered.resolve(objectFromCache);
//my else condition
//It is not in cache so let me make the call.
$http.get('myurl').then(function(result){
//Do validation with data and if it doesnot match then reject it
defered.reject(reason);
//Else Do something with the data put it into the cache, mapping logic etc..
defered.resolve(dto);
}).catch(function(error){
//do something with error and then reject
defered.reject(reasonDerived);
});
return defered.promise;
}
.
これは単純化されていない明示的なバージョンです(クレジット:ベンジャミングレンバム):
var cached = null;
function getCurrentUserData(userId){
return cached = cached || $http.get('myurl').then(function(result){
if(isNotValid(result)) return $q.reject(reason); // alternatively `throw`
return transformToDto(result);
}, function(response){
if(checkforsomethingonstatusandreject)
return $q.reject('Errored Out')
//do some actions to notify the error scenarios and return default actions
return someDefaults; });
}
.
あなたはもちろん彼らの理由を返すのではなく、それをさらにチェックに基づいてそれを変換するのではなく、その考えは価値ではなく約束をキャッシュしています。これは、メソッドが一度返される前に呼び出されると、複数のHTTP要求を行わないという利点もあります。
今あなたはいつでもやることができます: -
getCurrentUserData(userid).then(function(user){
}).catch(function(error){
});
.
約束を通しても連鎖することができます。だからあなたもこれを行うことができます: -
return $resource('myresource').$promise.then(function(result){
//Do some mapping and return mapped data
return mappedResult;
});
. 他のヒント
A +の約束は静的な方法を提供するべきです:
Promise.resolve(val);
.
...が予め解決された約束を生成します。あなたの約束図書館がこれを提供する場合は、これらのいずれかを返すべきです。すごい。インターフェイスの重複を避けるためにこれを頻繁に行います。