ดังนั้นฉันจึงมีสถานการณ์ที่ฉันมีโซ่สัญญาหลายอันที่ไม่ทราบความยาว ฉันต้องการให้ดำเนินการบางอย่างเมื่อ CHAINS ทั้งหมดได้รับการประมวลผลแล้ว เป็นไปได้หรือไม่? นี่คือตัวอย่าง:
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);
});
ในตัวอย่างนี้ฉันตั้งค่า$q.all()
สำหรับคำสัญญาหนึ่งสองและสามซึ่งจะได้รับการแก้ไขในบางเวลาแบบสุ่ม จากนั้นฉันก็เพิ่มคำสัญญาลงในตอนท้ายของหนึ่งและสาม ฉันต้องการall
ให้แก้ไขเมื่อเครือข่ายทั้งหมดได้รับการแก้ไขแล้ว นี่คือผลลัพธ์เมื่อฉันเรียกใช้รหัสนี้:
one done
one doneChained
two done
three done
ALL PROMISES RESOLVED
three doneChained
three doneChainedChained
มีวิธีรอให้โซ่คลายตัวหรือไม่?