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