Saya memiliki layanan i18n di aplikasi saya yang berisi kode berikut:
var i18nService = function() {
this.ensureLocaleIsLoaded = function() {
if( !this.existingPromise ) {
this.existingPromise = $q.defer();
var deferred = this.existingPromise;
var userLanguage = $( "body" ).data( "language" );
this.userLanguage = userLanguage;
console.log( "Loading locale '" + userLanguage + "' from server..." );
$http( { method:"get", url:"/i18n/" + userLanguage, cache:true } ).success( function( translations ) {
$rootScope.i18n = translations;
deferred.resolve( $rootScope.i18n );
} );
}
if( $rootScope.i18n ) {
this.existingPromise.resolve( $rootScope.i18n );
}
return this.existingPromise.promise;
};
Idenya adalah bahwa pengguna akan menelepon ensureLocaleIsLoaded
dan menunggu janji diselesaikan. Tetapi mengingat bahwa tujuan dari fungsi ini hanya untuk memastikan bahwa lokal dimuat, akan sangat baik bagi pengguna untuk memanggilnya beberapa kali.
Saat ini saya hanya menyimpan satu janji dan menyelesaikannya jika pengguna memanggil fungsi itu lagi setelah lokal berhasil diambil dari server.
Dari apa yang saya tahu, ini berfungsi sebagaimana mestinya, tetapi saya bertanya-tanya apakah ini pendekatan yang tepat.
javascript
angularjs
Der Hochstapler
sumber
sumber
Jawaban:
Seperti yang saya pahami tentang janji saat ini, ini seharusnya 100% baik-baik saja. Satu-satunya hal yang perlu dipahami adalah bahwa setelah diselesaikan (atau ditolak), itu untuk objek yang ditangguhkan - selesai.
Jika Anda harus
then(...)
menepati janjinya lagi, Anda harus segera mendapatkan hasil (pertama) terselesaikan / ditolak.Panggilan tambahan ke
resolve()
tidak akan (seharusnya tidak?) Berpengaruh. Tidak yakin apa yang terjadi jika Anda mencobareject
objek yang ditangguhkan sebelumnyaresolved
(saya tidak curiga apa-apa).sumber
Saya menghadapi hal yang sama beberapa waktu yang lalu, memang janji hanya bisa diselesaikan sekali, percobaan lain tidak akan melakukan apa-apa (tidak ada kesalahan, tidak ada peringatan, tidak ada
then
permintaan).Saya memutuskan untuk mengatasinya seperti ini:
cukup teruskan fungsi Anda sebagai panggilan balik dan panggil sesering yang Anda inginkan! Harapan itu masuk akal.
sumber
getUsers
dan kemudian.then()
menepati janji itu sebanyak yang Anda inginkan. Tidak perlu meneruskan panggilan balik. Menurut pendapat saya, salah satu keuntungan dari promise adalah Anda tidak perlu menentukan callback di muka..then
pernyataan. Untuk apa nilainya, saya pikir satu-satunya cara untuk mengembalikan data beberapa kali ke konteks panggilan adalah dengan menggunakan callback dan bukan janji, karena janji tidak dibuat untuk berfungsi dengan cara itu.Jika Anda perlu mengubah nilai pengembalian janji, cukup kembalikan nilai baru
then
dan rantai berikutnyathen
/catch
di atasnyasumber
Tidak ada cara yang jelas untuk menyelesaikan janji berkali-kali karena sejak sudah terselesaikan maka sudah selesai. Pendekatan yang lebih baik di sini adalah dengan menggunakan pola pengamat-pengamatan misalnya saya menulis kode berikut yang mengamati acara klien soket. Anda dapat memperpanjang kode ini untuk memenuhi kebutuhan Anda
sumber
Anda dapat menulis tes untuk mengonfirmasi perilaku tersebut.
Dengan menjalankan tes berikut, Anda dapat menyimpulkan bahwa
Anda juga dapat memeriksa posting blog saya untuk detailnya.
sumber
Yang harus Anda lakukan adalah meletakkan ng-if pada outlet-ng utama Anda dan menampilkan pemintal pemuatan sebagai gantinya. Setelah lokal Anda dimuat, Anda menunjukkan outlet dan membiarkan hierarki komponen dirender. Dengan cara ini, semua aplikasi Anda dapat mengasumsikan bahwa lokal telah dimuat dan tidak perlu pemeriksaan.
sumber