【问题标题】:How to return promise in an async method?如何在异步方法中返回承诺?
【发布时间】:2020-01-03 12:25:34
【问题描述】:

我正在处理调用异步函数的代码。在这种情况下,run 方法对返回字符串的方法执行await 调用。如何转换 run 方法以再次返回一个承诺?

我搜索了互联网,但找不到解决方案。我是 Typescript 和异步编程的新手。

我还想问:await 关键字是否“转换”了字符串中返回的承诺?结果是一个字符串,但为什么我不必用.then() 解包来获取字符串呢?如果结果是一个承诺,我可以在run 方法中返回它,但run 必须返回一个承诺。

public async run(): Promise<IMyType> {
    log.info("Running item1 ...");

    let result: IMyType = {
        name: "name1",
        outcome: undefined,
        message: "",
        various: {}
    };

    result = await this.runCheck(result);
    if (result.outcome) {
        result.message = this.successMessage;
    } else {
        result.message = this.failMessage;
    }

    return result;
}


private async runCheck(
    result: IMyType
): Promise<IMyTypet>

【问题讨论】:

  • async / await 是语法糖,有助于以看似同步的方式处理 Promise(意思是:代码看起来是同步的,尽管它仍然是基于 Promise 的)。异步函数将总是返回一个承诺。

标签: typescript asynchronous


【解决方案1】:

以下是在异步函数中返回 Promise 的方法:

let getSomeValue = async () : Promise<string> => {
    let promise: Promise<number> = new Promise((resolve, reject) => {
        setTimeout(function() { resolve("my result") }, 50); //for example
    });
    return promise;
}

然后你可以这样消费它:

let result = await getSomeValue();

还有你的问题:

“await 关键字是否将返回的 Promise 转换为字符串?”

是的,“我的结果”将在这里分配给结果。

【讨论】:

    【解决方案2】:

    您的代码中已经有了答案。 当你用async 标记一个函数时,这意味着它会返回一个promise,不管函数内部是什么。如果你返回一个值,它将是 Promise 已解析的值。

    runCheck() 被标记为async,您正在使用await-ing 它来获取字符串值。 run() 函数也是如此。你已经用async 标记了它,这意味着它会返回一个承诺,不管里面是什么。您正在返回字符串值,这意味着您可以这样做:

    const theString = await object.run(); // theString is the value you return in function
    

    【讨论】:

      猜你喜欢
      • 2019-03-20
      • 2022-01-26
      • 2019-03-27
      • 2022-11-03
      • 1970-01-01
      • 2019-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多