4
จะรอให้ JavaScript Promise แก้ไขก่อนที่จะกลับมาทำงานได้อย่างไร
ฉันกำลังทำการทดสอบหน่วย กรอบการทดสอบจะโหลดเพจลงใน iFrame จากนั้นเรียกใช้การยืนยันกับเพจนั้น ก่อนการทดสอบแต่ละครั้งจะเริ่มขึ้นฉันจะสร้างสิ่งPromiseที่กำหนดให้onloadเหตุการณ์ของ iFrame เรียกresolve()ตั้งค่า iFrame srcและส่งคืนคำสัญญา ดังนั้นฉันก็สามารถโทรloadUrl(url).then(myFunc)และมันจะรอให้การโหลดหน้าก่อนที่จะดำเนินสิ่งที่myFuncเป็น ฉันใช้รูปแบบประเภทนี้ทั่วทุกที่ในการทดสอบของฉัน (ไม่ใช่แค่การโหลด URL) โดยหลักแล้วเพื่อให้การเปลี่ยนแปลง DOM เกิดขึ้น (เช่นเลียนแบบการคลิกปุ่มและรอให้ divs ซ่อนและแสดง) ข้อเสียของการออกแบบนี้คือฉันมักจะเขียนฟังก์ชันที่ไม่ระบุตัวตนโดยมีโค้ดสองสามบรรทัดอยู่ในนั้น นอกจากนี้ในขณะที่ฉันมีวิธีแก้ไข (QUnit's assert.async()) ฟังก์ชันทดสอบที่กำหนดคำสัญญาจะเสร็จสมบูรณ์ก่อนที่สัญญาจะทำงาน ฉันสงสัยว่ามีวิธีใดที่จะได้รับค่าจากPromiseหรือรอ (บล็อก / นอนหลับ) จนกว่าจะได้รับการแก้ไขที่คล้ายกับของ IAsyncResult.WaitHandle.WaitOne().NET ฉันรู้ว่า JavaScript เป็นเธรดเดียว แต่ฉันหวังว่านั่นไม่ได้หมายความว่าฟังก์ชันจะไม่สามารถให้ผลลัพธ์ได้ โดยพื้นฐานแล้วมีวิธีที่จะทำให้สิ่งต่อไปนี้คายผลลัพธ์ตามลำดับที่ถูกต้องหรือไม่? function kickOff() { return new Promise(function(resolve, reject) { $("#output").append("start"); setTimeout(function() { resolve(); }, 1000); }).then(function() …