ลำดับปฏิบัติการ JS Firebase [ซ้ำ]

Aug 28 2020

ใครช่วยอธิบายให้ฉันฟังได้ไหมว่าทำไมโค้ดด้านล่างจึงเรียกใช้การแจ้งเตือน "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");

คำตอบ

1 DougStevenson Aug 28 2020 at 00:23

once()เป็นแบบอะซิงโครนัสและส่งกลับทันทีก่อนที่แบบสอบถามจะเสร็จสมบูรณ์ การโทรกลับที่คุณให้ไว้จะดำเนินการในภายหลัง

Firebase API ทั้งหมดเป็นแบบอะซิงโครนัสและเป็นเรื่องปกติมากใน JavaScript นอกจากนี้คุณควรทราบด้วยว่าonce()ส่งคืนคำสัญญาด้วยและคำสัญญานั้นเป็นวิธีที่ดีกว่าในการจัดการผลลัพธ์ของการโทรแบบอะซิงโครนัส การเขียนโปรแกรม JavaScript สมัยใหม่เป็นสิ่งสำคัญมากในการทำความเข้าใจว่าสัญญาทำงานอย่างไร

ผมขอแนะนำให้อ่านบล็อกเกี่ยวกับเรื่องนี้ว่าทำไม APIs Firebase มีไม่ตรงกัน

1 Titulum Aug 28 2020 at 00:26

ที่คุณสามารถดูในเอกสาร , 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