จากความคิดเห็นของคุณคุณน่าจะทำทุกอย่างที่ HTMLElement พร้อมกับการโหลดสินทรัพย์ทำ: ให้ constructor เริ่มต้นการดำเนินการด้านข้างสร้างการโหลดหรือเหตุการณ์ข้อผิดพลาดขึ้นอยู่กับผลลัพธ์
ใช่นั่นหมายถึงการใช้สัญญา แต่มันก็หมายถึง "ทำสิ่งต่าง ๆ เช่นเดียวกับองค์ประกอบ HTML อื่น ๆ " ดังนั้นคุณจึงอยู่ใน บริษัท ที่ดี ตัวอย่างเช่น
var img = new Image();
img.onload = function(evt) { ... }
img.addEventListener("load", evt => ... );
img.onerror = function(evt) { ... }
img.addEventListener("error", evt => ... );
img.src = "some url";
เตะออกนี้โหลดไม่ตรงกันของสินทรัพย์แหล่งที่มาว่าเมื่อมันประสบความสำเร็จในปลายและเมื่อมันผิดพลาดในปลายonload
onerror
ดังนั้นให้ชั้นเรียนของคุณทำสิ่งนี้ด้วย:
class EMailElement extends HTMLElement {
constructor() {
super();
this.uid = this.getAttribute('data-uid');
}
setAttribute(name, value) {
super.setAttribute(name, value);
if (name === 'data-uid') {
this.uid = value;
}
}
set uid(input) {
if (!input) return;
const uid = parseInt(input);
// don't fight the river, go with the flow
let getEmail = new Promise( (resolve, reject) => {
yourDataBase.getByUID(uid, (err, result) => {
if (err) return reject(err);
resolve(result);
});
});
// kick off the promise, which will be async all on its own
getEmail()
.then(result => {
this.renderLoaded(result.message);
})
.catch(error => {
this.renderError(error);
});
}
};
customElements.define('e-mail', EmailElement);
จากนั้นคุณทำให้ฟังก์ชั่น renderLoaded / renderError จัดการกับการเรียกเหตุการณ์และเงาโดม:
renderLoaded(message) {
const shadowRoot = this.attachShadow({mode: 'open'});
shadowRoot.innerHTML = `
<div class="email">A random email message has appeared. ${message}</div>
`;
// is there an ancient event listener?
if (this.onload) {
this.onload(...);
}
// there might be modern event listeners. dispatch an event.
this.dispatchEvent(new Event('load', ...));
}
renderFailed() {
const shadowRoot = this.attachShadow({mode: 'open'});
shadowRoot.innerHTML = `
<div class="email">No email messages.</div>
`;
// is there an ancient event listener?
if (this.onload) {
this.onerror(...);
}
// there might be modern event listeners. dispatch an event.
this.dispatchEvent(new Event('error', ...));
}
นอกจากนี้โปรดทราบว่าฉันเปลี่ยนของคุณid
เป็น a class
เพราะหากคุณไม่ได้เขียนโค้ดแปลก ๆ เพื่อให้อนุญาตอินสแตนซ์เดียวของ<e-mail>
องค์ประกอบของคุณบนหน้าเว็บคุณไม่สามารถใช้ตัวระบุที่ไม่ซ้ำกันแล้วกำหนดให้กับองค์ประกอบมากมาย