Jadi saya memiliki situasi di mana saya memiliki banyak rantai janji dengan panjang yang tidak diketahui. Saya ingin beberapa tindakan dijalankan ketika semua CHAINS telah diproses. Apakah itu mungkin? Berikut ini contohnya:
app.controller('MainCtrl', function($scope, $q, $timeout) {
var one = $q.defer();
var two = $q.defer();
var three = $q.defer();
var all = $q.all([one.promise, two.promise, three.promise]);
all.then(allSuccess);
function success(data) {
console.log(data);
return data + "Chained";
}
function allSuccess(){
console.log("ALL PROMISES RESOLVED")
}
one.promise.then(success).then(success);
two.promise.then(success);
three.promise.then(success).then(success).then(success);
$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);
});
Dalam contoh ini, saya menyiapkan $q.all()
untuk promise satu, dua, dan tiga yang akan diselesaikan pada waktu acak. Saya kemudian menambahkan janji di akhir satu dan tiga. Saya ingin all
menyelesaikan ketika semua rantai telah diselesaikan. Berikut adalah outputnya ketika saya menjalankan kode ini:
one done
one doneChained
two done
three done
ALL PROMISES RESOLVED
three doneChained
three doneChainedChained
Apakah ada cara untuk menunggu rantai itu terpecahkan?
angularjs
promise
angular-promise
Jensengar
sumber
sumber
Q.all
dieksekusi - jika tidak, itu harus sepele?$q.all
, namun begitu saya memulai proses penyelesaian, tidak ada tindakan / janji baru yang akan dirangkai.The jawaban yang diterima adalah benar. Saya ingin memberikan contoh untuk menjelaskan sedikit kepada mereka yang tidak terbiasa
promise
.Contoh:
Dalam contoh saya, saya perlu mengganti
src
atributimg
tag dengan url mirror yang berbeda jika tersedia sebelum merender konten.Penjelasan:
Dari dokumen AngularJS :
The
then
Metode:$ q.all (janji)
The
promises
param dapat array janji.Tentang
bind()
, Info selengkapnya di sini: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bindsumber
then
Metode$q.all
disediakan berbagai janji-janji kembali, sehingga Anda dapat loop bahwa array dan panggilanthen
pada setiap item dalam array, sebagai lawan meneleponthen
ketika Anda menambahkan janji untukpromise_array
.Baru-baru ini mengalami masalah ini tetapi dengan jumlah promise yang tidak diketahui . Dipecahkan menggunakan jQuery.map () .
sumber
Ada jalan.
$q.all(...
Anda dapat memeriksa barang-barang di bawah ini:
http://jsfiddle.net/ThomasBurleson/QqKuk/
http://denisonluz.com/blog/index.php/2013/10/06/angularjs-returning-multiple-promises-at-once-with-q-all/
sumber
$q.all([p1.then(..).then(...).then(...).then(...) ...]);
kan?Anda bisa menggunakan "await" dalam "fungsi async" .
CATATAN: Saya tidak 100% yakin Anda dapat memanggil fungsi async dari fungsi non-async dan mendapatkan hasil yang benar.
Yang mengatakan ini tidak akan pernah digunakan di situs web. Tetapi untuk pengujian beban / pengujian integrasi ... mungkin.
Kode contoh:
sumber