Apabila menggunakan AngularJS untuk mengendalikan janji, kadangkala anda akan menghadapi situasi di mana anda perlu mengendalikan berbilang janji.
Penyelesaian yang paling mudah adalah untuk mendapatkan setiap janji. Seperti berikut:
var app = angular.module("app",[]); app.controller("AppCtrl", function($q. $timeout){ var one = $q.defer(); var two = $q.defer(); var three = $q.defer(); $timeout(function(){ one.resolve("one done"); }, Math.random() * 1000) $timeout(function(){ two.resolve("two done"); }, Math.random() * 1000) $timeout(function(){ three.resolve("three done"); }, Math.random() * 1000) functioin success(data){ console.log(data); } one.promise.then(success); two.promise.then(success); three.promise.then(success); })
Adakah cara yang lebih baik?
Kaedah $q.all boleh menerima pelbagai janji dan dipanggil seperti berikut:
var all = $q.all([one.promise, two.promise, three.promise]); all.then(success);
Apa itu janji?
Promise ialah kaedah memproses nilai secara tidak segerak, yang mewakili nilai pulangan terakhir atau pengecualian yang dilemparkan oleh fungsi Apabila berurusan dengan objek jauh, kita boleh menganggapnya sebagai objek jauh. seorang ejen. Jika promise juga merupakan sejenis kaedah pemprosesan tak segerak, maka kita akan memikirkan perbezaannya daripada XHR dan $.ajax?
Adalah kebiasaan untuk js menggunakan penutupan atau panggil balik untuk membalas data yang dikembalikan secara tidak segerak, seperti permintaan XHR selepas halaman dimuatkan. Kita boleh berinteraksi dengan data secara normal seolah-olah ia telah dikembalikan tanpa bergantung pada pencetus fungsi panggil balik.
Jadi apakah masalah yang dicadangkan oleh ng bertujuan untuk menyelesaikannya? Panggilan balik telah digunakan untuk masa yang lama, dan biasanya nyahpepijat menjadi sangat sukar jika terdapat panggilan balik yang bergantung pada panggilan balik lain dan ralat perlu dipaparkan selepas setiap panggilan. Perbezaannya ialah janji memberikan abstraksi lain: fungsi ini mengembalikan objek janji.
Kenapa guna promise
Salah satu faedah menggunakan janji ialah anda melarikan diri daripada logik pemikiran tetap panggilan balik. Janji menjadikan mekanisme pemprosesan tak segerak kelihatan lebih seperti penyegerakan Berdasarkan fungsi segerak, kita boleh menangkap nilai pulangan dan nilai pengecualian seperti yang diharapkan. Ralat boleh ditangkap pada bila-bila masa dalam program dan memintas kod berikutnya yang bergantung pada pengecualian program Kita tidak perlu memikirkan manfaat penyegerakan ini. Oleh itu, tujuan menggunakan janji adalah untuk mendapatkan gabungan fungsi dan keupayaan menggelegak ralat sambil mengekalkan keupayaan untuk menjalankan kod secara tidak segerak.
Promise ialah objek kelas pertama dan disertakan dengan beberapa konvensyen.
• Hanya satu azam atau penolakan akan dipanggil.
• Jika janji dilaksanakan atau ditolak, pengendali yang bergantung kepada mereka akan tetap dipanggil.
• Pengendali sentiasa dipanggil secara tidak segerak.