Rumah  >  Artikel  >  hujung hadapan web  >  Promise object dalam Angular ($q pengenalan)_AngularJS

Promise object dalam Angular ($q pengenalan)_AngularJS

WBOY
WBOYasal
2016-05-16 16:11:351492semak imbas

Semasa saya menggunakan JQuery, saya tahu janji itu ialah model pengaturcaraan tak segerak JS, tetapi saya tidak begitu memahami perbezaan antaranya dan objek tertunda JQuery. Semasa projek syarikat itu berkembang, kami perlu menerima data daripada bahagian belakang, jadi kami memutuskan untuk menyelesaikannya.

Janji

Promise ialah mod yang mengendalikan peristiwa tak segerak dalam bentuk proses operasi segerak, mengelakkan lapisan bersarang dan boleh mengendalikan peristiwa tak segerak dalam rantai.

Kami tahu bahawa semasa menulis kod asynchronous JavaScript, panggilan balik adalah mekanisme yang paling mudah, bagaimanapun, menggunakan mekanisme ini mesti mengorbankan aliran kawalan, pengendalian pengecualian dan semantik fungsi, malah boleh menyebabkan kami terjebak ke dalam perangkap panggilan balik janji menyelesaikan masalah ini.

Janji dalam ES6, Q terbina dalam AngularJS terbina dalam angularJS, dan apabila menerima pakai spesifikasi Promises/A, seperti berikut:

Setiap tugasan mempunyai tiga status: belum selesai, dipenuhi dan ditolak.

status 1.pending: boleh beralih kepada status pemenuhan atau penolakan.
2. Keadaan terpenuhi: Ia tidak boleh ditukar kepada mana-mana keadaan lain, dan keadaan itu mesti mempunyai nilai.
3. Keadaan ditolak: Ia tidak boleh ditukar kepada mana-mana keadaan lain, dan keadaan itu tidak boleh diubah.

Pemindahan negeri adalah sekali sahaja Setelah keadaan dipenuhi (selesai) atau gagal (gagal/ditolak), ia tidak boleh diubah lagi.

Salin kod Kod adalah seperti berikut:

fungsi okToGreet(nama){
Nama pulangan === 'Robin Hood';
}

fungsi asyncGreet(nama) {
var tertunda = $q.defer();

setTimeout(function() {
// Oleh kerana fungsi asynchronous fn ini akan dilaksanakan secara tak segerak pada masa hadapan, kami membungkus kod ke dalam panggilan $apply sambil memerhatikan perubahan model dengan betul
$scope.$apply(function() {
              ditangguhkan. maklumkan('Mengenai salam ' nama '.');

                 jika (okToGreet(nama)) {
                   tertunda.resolve('Hello, ' name '!');
              } lain {
                    ditangguhkan.tolak('Salam ' nama ' tidak dibenarkan.');
            }
        });
}, 1000);

Pulangan tertunda.janji;
}

var promise = asyncGreet('Robin Hood');
promise.then(fungsi(salam) {
alert('Kejayaan: ' salam);
}, fungsi(sebab) {
alert('Gagal: ' sebab);
}, fungsi(kemas kini) {
alert('Mendapat pemberitahuan: ' kemas kini);
});

Penggunaan asas Q Promise

Kod di atas menunjukkan peranan beberapa kaedah bagi contoh tertunda yang dibina oleh $q.defer(). Jika operasi tak segerak berjaya, gunakan kaedah penyelesaian untuk menukar status objek Janji kepada "berjaya" (iaitu, daripada belum selesai kepada diselesaikan jika operasi tak segerak gagal, gunakan kaedah tolak untuk menukar status kepada "gagal"); (iaitu, daripada belum selesai kepada diselesaikan). Akhirnya, deferred.promise dikembalikan, dan kita boleh memanggil kaedah kemudian dalam rantai.

JS akan mempunyai Promise asli, ES6 sudah mempunyai objek Promise, firefox dan versi beta Chrome 32 telah melaksanakan API Promise asas

$q.defferd dalam AngularJs

Panggil $q.defferd untuk mengembalikan objek yang ditangguhkan kepada panggilan berantai. Objek ini mengaitkan tiga keadaan tugas dalam spesifikasi Promises/A melalui API.

IPU tertunda

Kaedah objek tertunda

1.resolve(value): Pada pengisytiharan resolve(), ia menunjukkan bahawa objek promise berubah daripada keadaan belum selesai untuk diselesaikan.
2.reject(reason): Pada pengisytiharan menyelesaikan(), ia menunjukkan bahawa objek janji berubah daripada keadaan belum selesai kepada ditolak.
3.notify(value): Apabila notify() diisytiharkan, ia menunjukkan keadaan objek promise yang tidak dipenuhi dan boleh dipanggil beberapa kali sebelum menyelesaikan atau menolak.

sifat objek tertunda

janji: Apa yang akhirnya dikembalikan ialah atribut janji objek tertunda yang baharu, bukan objek tertunda asal. Objek Promise baharu ini hanya boleh memerhati keadaan objek Promise asal dan tidak boleh mengubah suai keadaan dalaman objek tertunda untuk menghalang keadaan tugas daripada diubah suai secara luaran.

Promise API

Apabila kejadian tertunda dibuat, objek janji baharu dicipta dan rujukan boleh diperoleh melalui deferred.promise.

Tujuan objek janji adalah untuk membolehkan bahagian yang berminat mendapatkan hasil pelaksanaannya apabila tugas tertunda selesai.

Kaedah objek Janji

1.then(errorHandler, fulfilledHandler, progressHandler): Kaedah kemudian digunakan untuk memantau keadaan Janji yang berbeza. ErrorHandler memantau status gagal, fulfilledHandler memantau status dipenuhi dan progressHandler memantau status tidak dipenuhi (tidak lengkap). Selain itu, panggilan balik pemberitahuan boleh dipanggil sifar hingga lebih banyak kali, memberikan petunjuk kemajuan sebelum menyelesaikan atau menolak (selesaikan dan ditolak).
2.catch(errorCallback) - pintasan untuk promise.then(null, errorCallback)
3.finally(callback) - membolehkan anda melihat sama ada janji dilaksanakan atau ditolak, tetapi melakukannya tanpa mengubah nilai akhir. Ini boleh digunakan untuk melakukan beberapa kerja mengeluarkan sumber atau membersihkan objek yang tidak digunakan, tidak kira sama ada janji itu ditolak atau diselesaikan. Untuk maklumat lanjut, lihat spesifikasi dokumentasi penuh.

Panggilan berantai janji boleh dilaksanakan melalui kaedah then().

Salin kod Kod adalah seperti berikut:

promiseB = promiseA.then(fungsi(hasil) {
Kembalikan hasil 1; });

// promiseB akan diproses serta-merta selepas promiseA diproses,
// Dan nilai nilainya ialah hasil promiseA meningkat sebanyak 1

Kaedah lain $q

$q.when(value): Lulus nilai pembolehubah, promise.then() melaksanakan panggilan balik yang berjaya

$q.all(promises): Berbilang janji mesti dilaksanakan dengan jayanya sebelum panggilan balik kejayaan boleh dilaksanakan Nilai yang diluluskan ialah nilai tatasusunan atau cincangan Setiap nilai dalam tatasusunan adalah objek janji yang sepadan dengan Indeks

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn