ลำดับปฏิบัติการ JS Firebase [ซ้ำ]
ใครช่วยอธิบายให้ฉันฟังได้ไหมว่าทำไมโค้ดด้านล่างจึงเรียกใช้การแจ้งเตือน "F" ก่อนจากนั้นจึงแจ้งเตือน "S" และ "V"
var status = ' ';
database.ref('housekeeping/ongoing').once('value', function(snapshot){
alert(status + "S");
status = snapshot.val();
alert(status + "V");
});
alert(status + "F");
คำตอบ
once()เป็นแบบอะซิงโครนัสและส่งกลับทันทีก่อนที่แบบสอบถามจะเสร็จสมบูรณ์ การโทรกลับที่คุณให้ไว้จะดำเนินการในภายหลัง
Firebase API ทั้งหมดเป็นแบบอะซิงโครนัสและเป็นเรื่องปกติมากใน JavaScript นอกจากนี้คุณควรทราบด้วยว่าonce()ส่งคืนคำสัญญาด้วยและคำสัญญานั้นเป็นวิธีที่ดีกว่าในการจัดการผลลัพธ์ของการโทรแบบอะซิงโครนัส การเขียนโปรแกรม JavaScript สมัยใหม่เป็นสิ่งสำคัญมากในการทำความเข้าใจว่าสัญญาทำงานอย่างไร
ผมขอแนะนำให้อ่านบล็อกเกี่ยวกับเรื่องนี้ว่าทำไม APIs Firebase มีไม่ตรงกัน
ที่คุณสามารถดูในเอกสาร , onceเป็นสายไม่ตรงกัน ซึ่งหมายความว่าโค้ดจะทำงานแบบซิงโครนัสต่อไปจนกว่าจะได้รับข้อมูล จากนั้นรหัสในการโทรกลับของคุณจะถูกเรียกใช้งาน
เพื่อให้การแจ้งเตือน 'S' และ 'V' ปรากฏขึ้นก่อนคุณจะต้องใช้ประโยชน์จากasync/await:
async function getDatabaseData() {
const snapshot = await database.ref('housekeeping/ongoing').once('value');
alert(status + "S");
status = snapshot.val();
alert(status + "V");
alert(status + "F");
}
ข้อมูลเพิ่มเติมเกี่ยวกับ async/await