プロミスを返す関数を書こうとしています。ただし、要求された情報がすぐに利用できる場合があります。私はそれを約束に包んで、消費者が決定をする必要がないようにしたいと思います。
function getSomething(id) {
if (Cache[id]) {
var deferred = $q.defer();
deferred.resolve(Cache[id]); // <-- Can I do this?
return deferred.promise;
} else {
return $http.get('/someUrl', {id:id});
}
}
次のように使用します。
somethingService.getSomething(5).then(function(thing) {
alert(thing);
});
問題は、コールバックが事前に解決されたpromiseに対して実行されないことです。これは正当なことですか?この状況を処理するより良い方法はありますか?
クラッド。私の人生の1時間が失われました。私はこれを単体テストで試していましたが、テストが完了した後、約束は満たされましたが、見ていませんでした。コードではなく、テストに問題があります。
—
Craig Celeste
$ scope。$ apply()を呼び出して、テスト中に問題がすぐに解決することを確認してください。
—
dtabuenc 2013
私はhttpbackend.flushがこれを説明すると思いますが、$ qはそうではないかもしれません。このテストではスコープを使用していません。私はサービスを直接テストしていますが、とにかくそれを機能させました。
—
Craig Celeste
return $q.when(Cache[id])
。とにかく、毎回新しいプロミスを作成しているので、これは機能し、毎回コールバックを呼び出す必要があります。