Zoeken op website

asynchroon - TypeScript roept async functie aan vanuit synchrone functie en retourneert boolean


Hoe kan ik een asynchrone functie aanroepen vanuit een synchrone functie. Ik snap het niet.

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 is de asynchrone functie.

Het probleem is dat het terugkeerresultaat wordt aangeroepen voordat de asynchrone bewerking is voltooid.

Hoe kan ik dit probleem oplossen?

Antwoord #1

Je kunt de belofte in ES6 proberen.

Sluit het asynchrone deel in de belofte en voer de return uit vanaf het then-gedeelte. Probeer alstublieft de volgende code uit

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);
    }
});

Of je kunt de belofte zelf teruggeven vanuit de functie als je dat nodig hebt

Voor meer details, zie https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

Antwoord #2

Hoewel de code synchron lijkt, is het nog steeds een asynchrone functie.

U wilt mogelijk showOpenCaseDialog wijzigen in een async functie, die Promise<boolean> zou retourneren.

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;
};