ฉันมีฟังก์ชันที่ต้องทำอะไรบางอย่างแบบอะซิงก์ในไม่กี่ขั้นตอน ทุกขั้นตอนอาจล้มเหลวได้ อาจล้มเหลวก่อนขั้นตอนที่ 1 ดังนั้นคุณอาจทราบผลลัพธ์ทันทีหรือหลังจาก 1.5 วินาที เมื่อล้มเหลว จะต้องเรียกใช้การโทรกลับ ระบุ เมื่อ สำเร็จ (ฉันใช้ เมื่อ อย่างตั้งใจ เพราะไม่ใช่แค่ ถ้า: จังหวะเป็นสิ่งสำคัญ)
ฉันคิดว่า Promises นั้นสมบูรณ์แบบ เพราะ async และพวกเขาแก้ไขได้เพียงครั้งเดียว แต่ก็ยังมีปัญหา: มันจะล้มเหลวเมื่อใด ฉันสามารถเห็นได้อย่างชัดเจนว่าเมื่อใดจะสำเร็จ (หลังจากขั้นตอนสุดท้าย) แต่เมื่อใดจะล้มเหลว ภายใน/ก่อนก้าวใดๆ
นี่คือสิ่งที่ฉันมีตอนนี้ แต่มันไร้สาระ:
function clickSpeed() {
return new Promise(function(resolve, reject) {
if ( test('one') ) {
return setTimeout(function() {
if ( test('two') ) {
return setTimeout(function() {
if ( test('three') ) {
return setTimeout(function() {
console.log('resolving...');
resolve();
}, 500);
}
console.log('rejecting...');
reject();
}, 500);
}
console.log('rejecting...');
reject();
}, 500);
}
console.log('rejecting...');
reject();
});
}
(test()
สุ่มผ่านหรือไม่ผ่านขั้นตอน)
เล่นซอที่นี่: http://jsfiddle.net/rudiedirkx/zhdrjjx1/
ฉันเดาว่าวิธีแก้ปัญหาคือการโยงสัญญา ซึ่งจะแก้ไขหรือปฏิเสธทุกขั้นตอน .. ? อาจจะ. นั่นคือสิ่งที่? ฉันจะใช้สิ่งนั้นได้อย่างไร?
สิ่งนี้ใช้ได้กับขั้นตอนที่ไม่ทราบจำนวนหรือไม่
return
ที่return setTimeout(function() {
คืออะไร? - person guest271314   schedule 23.11.2015return
อยู่ที่นั่นเพียงเพื่อป้องกันไม่ให้console.log('rejecting...'); reject();
ทำงาน - person Bergi   schedule 23.11.2015promise.then(function(res, reject) { res('step1') or reject('err')}).then(function(res) { res('step2')}).catch(function(err) { console.log(err) })
- person Errorpro   schedule 23.11.2015test
ไม่ปฏิเสธสัญญา ?reject
จะถูกเรียกอย่างไรตามค่าส่งคืนของtest
ถ้าsetTimeout
ทำลายโฟลว์ - person guest271314   schedule 23.11.2015test()
ส่งคืนบูลเท่านั้น อาจไม่ใช่ฟังก์ชัน แต่เป็นคำสั่ง หรือตรวจสอบวัตถุ/คุณสมบัติอื่น การปฏิเสธเกิดขึ้น หลัง ทุก ๆ IF - person Rudie   schedule 23.11.2015test()
ส่งคืนบูล แต่การสุ่มมีไว้สำหรับการทดสอบเท่านั้น จะนำอะไรก็ตามจากที่อื่นซึ่งอาจปฏิเสธคำสัญญาหรือก้าวไปสู่ขั้นตอนต่อไป การตรวจสอบtest()
ไม่ใช่ฟังก์ชันเสมอไปและไม่ทราบเกี่ยวกับคำสัญญา - person Rudie   schedule 23.11.2015