TypeScript从同步函数中调用异步函数并返回布尔值

时间:2018-09-24 12:39:19

标签: typescript asynchronous synchronous

如何从同步函数中调用异步函数。我不明白。

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是异步函数。

问题在于,在异步完成之前调用返回结果。

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

尽管代码可能看起来是同步的,但它仍然是异步函数。

您可能希望将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;
};

答案 1 :(得分:0)

您可以在ES6中尝试诺言。

将异步部分包含在promise中,然后执行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);
    }
});

或者您可以根据需要从函数中返回promise

有关更多详细信息,请参阅 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

答案 2 :(得分:0)

asynFunction(var1, callback: (data)=> void) : any {
.....
this._service.apiCall(var1)
 .subscribe(res=>{
 .......
 .......
 return callback(res);
  });
}

预期使用回调:

this.asyncFunction(value1, (res)=>{
........
........
});

不带回调的用法:

this.asyncFunction(value1, null);