Saya mencoba untuk menulis fungsi yang mengembalikan sebuah janji. Tetapi ada kalanya informasi yang diminta segera tersedia. Saya ingin membungkusnya dengan janji agar konsumen tidak perlu mengambil keputusan.
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});
}
}
Dan gunakan seperti ini:
somethingService.getSomething(5).then(function(thing) {
alert(thing);
});
Masalahnya adalah callback tidak dijalankan untuk janji yang diselesaikan sebelumnya. Apakah ini hal yang sah untuk dilakukan? Adakah cara yang lebih baik untuk menangani situasi ini?
return $q.when(Cache[id])
. Bagaimanapun, ini harus berfungsi dan memanggil callback setiap kali karena Anda membuat janji baru setiap kali.Jawaban:
Jawaban singkat: Ya, Anda dapat menyelesaikan janji AngularJS sebelum mengembalikannya, dan itu akan berperilaku seperti yang Anda harapkan.
Dari JB Nizet's Plunkr tetapi refactored untuk bekerja dalam konteks apa yang awalnya diminta (yaitu panggilan fungsi ke layanan) dan sebenarnya di situs.
Di dalam layanan ...
Di dalam pengontrol ....
Saya harap ini membantu seseorang. Saya tidak menemukan jawaban lain dengan sangat jelas.
sumber
Cara mengembalikan janji yang telah diselesaikan sebelumnya di Angular 1.x
Janji terselesaikan:
Janji yang ditolak:
sumber
{resolved: $q.when, rejected: $q.reject}
Inilah cara saya biasanya melakukannya jika saya ingin benar-benar menyimpan data dalam cache atau objek
DEMO
sumber
Anda lupa menginisialisasi elemen Cache
sumber
Cache
dengan promise alih-alih objek yang dimaksudkan dan tipe kembalian untuk kasus-kasus ketika sebuah objek ada di Cache dan jika tidak, tidak akan sama. Ini lebih tepat, menurut saya:$http.get('/someUrl', {id: id}).then(function (response) { Cache[id] = response.data; return Cache[id]; });
Saya suka menggunakan pabrik untuk mendapatkan data dari sumber daya saya seperti.
Kemudian paparkan model saya dalam layanan seperti ini di sini
Kemudian pengontrol saya dapat memasukkannya dan mengeksposnya atau melakukan apa yang menurutnya benar dalam konteksnya hanya dengan mereferensikan Layanan yang diinjeksi.
Sepertinya bekerja dengan baik. Tapi saya agak baru mengenal sudut. * Penanganan kesalahan sebagian besar ditinggalkan untuk kejelasan
sumber
getStuff
Metode Anda menggunakan antipattern yang ditangguhkan