אסינכרוני - קריאת פונקציה אסינכרונית מפונקציה סינכרונית ב-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;
};