אסינכרוני - קריאת פונקציה אסינכרונית מפונקציה סינכרונית ב-TypeScript והחזרת בוליאני
איך אני יכול לקרוא לפונקציה אסינכרונית מפונקציה סינכרונית. אני לא מבין את זה.
function showOpenCaseDialog(): boolean {
let result = false;
var regardingobjectid = (<Xrm.LookupAttribute<string>>Xrm.Page.getAttribute("regardingobjectid")).getValue();
if (regardingobjectid != null && regardingobjectid.length > 0) {
var regardingobject = regardingobjectid[0];
if (regardingobject.entityType === "incident") {
checkCaseLastOpenActivity(regardingobject).then(x => result = x);
}
}
return result;
};
checkCaseLastOpenActivity היא הפונקציה האסינכרונית.
הבעיה היא שהפונקציה מחזירה תוצאה לפני שהפעולה האסינכרונית מסתיימת.
איך אני יכול לפתור את הבעיה הזאת?
תשובה #1
אתה יכול לנסות את ההבטחה ב-ES6.
כנס את החלק האסינכרוני בתוך ההבטחה והרץ את ההחזרה מהחלק של then. בבקשה נסה את הקוד הבא
var promise1=new Promise (>Xrm.Page.getAttribute("regardingobjectid")).getValue()) });
promise1.then((regardingobjectid){
if (regardingobjectid != null && regardingobjectid.length > 0) {
var regardingobject = regardingobjectid[0];
if (regardingobject.entityType === "incident") {
checkCaseLastOpenActivity(regardingobject).then(x => result = x);
}
});
או שאתה יכול להחזיר את ההבטחה עצמה מהפונקציה אם אתה צריך בכך
לעוד פרטים עיינו בכתובת https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
תשובה #2
למרות שהקוד עשוי להיראות סינכרוני, הוא עדיין פונקציה אסינכרונית.
ייתכן שתרצה לשנות את showOpenCaseDialog לפונקציה async, אשר תחזיר Promise<boolean>.
async function showOpenCaseDialog(): Promise<boolean> {
let result = false;
var regardingobjectid = (<Xrm.LookupAttribute<string>>Xrm.Page.getAttribute("regardingobjectid")).getValue();
if (regardingobjectid != null && regardingobjectid.length > 0) {
var regardingobject = regardingobjectid[0];
if (regardingobject.entityType === "incident") {
result = await checkCaseLastOpenActivity(regardingobject);
}
}
return result;
};
