【问题标题】:TypeScript call async function from synchronous function and return booleanTypeScript 从同步函数调用异步函数并返回布尔值
【发布时间】:2019-02-27 23:34:55
【问题描述】:

如何从同步函数调用异步函数。没看懂。

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

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

我该如何解决这个问题?

【问题讨论】:

    标签: typescript asynchronous synchronous


    【解决方案1】:
    asynFunction(var1, callback: (data)=> void) : any {
    .....
    this._service.apiCall(var1)
     .subscribe(res=>{
     .......
     .......
     return callback(res);
      });
    }
    

    使用期待回调:

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

    没有回调的用法:

    this.asyncFunction(value1, null);
    

    【讨论】:

      【解决方案2】:

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

      您可能希望将showOpenCaseDialog 修改为async 函数,这将返回Promise&lt;boolean&gt;。

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

      【讨论】:

        【解决方案3】:

        你可以试试 ES6 中的 promise。

        将 async 部分包含在 promise 中,然后执行 then 部分的 return 请尝试以下代码

        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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-04-20
          • 1970-01-01
          • 2015-08-24
          • 1970-01-01
          • 2023-02-10
          • 2018-01-03
          • 2022-01-14
          相关资源
          最近更新 更多