【问题标题】:How to resolve Promise using async/await function?如何使用 async/await 函数解决 Promise?
【发布时间】:2019-01-16 03:09:24
【问题描述】:

一旦解决了我的代码并没有到达最后返回 Promise.resolve(returnValue) 并抛出空的 {} 对象,我已经尝试并捕获,任何帮助将不胜感激以解决以下问题。

main.ts

private async combineData(data: any, request: any): Promise < any > {
    const details: any = [];
    const indexIDs = this.indexIDs;
    delete data.header.IndexOfRequestThatFailed;
    const returnValue = {
        "header": {
            "statusDesc": "",
            "statusCode": "",
            "refID": ""
        },
        "details": details
    }
    as IGetPaymentHistoryResponse;
    const paymentHistoryDetails = {
        header: returnValue.header,
        details: returnValue.details
    };
    // saving details to cache
    const saveDetails = {}
    as ICacheRequest;
    saveDetails.cacheobject = paymentHistoryDetails;
    saveDetails.cachetype = "CombinedPaymentHistoryCache";
    saveDetails.key =
    request.body.getPaymentHistoryRequest.header.serviceContext.tokenID;

    const _passedParams: ILogParams = {}
    as ILogParams;
    _passedParams.refId =
    request.body.getPaymentHistoryRequest.header.serviceContext.refID;
    _passedParams.sessionId =
    request.body.getPaymentHistoryRequest.header.serviceContext.tokenID;
    _passedParams.opname = "getPaymentHistory";
    _passedParams.starttime = moment().toString();
    _passedParams.endtime = "";

    try {
        await CacheController.getInstance().saveDetailsWrapper(saveDetails,
            _passedParams);
        return Promise.resolve({
            getPaymentHistoryResponse: paymentHistoryDetails
        });
    } catch (err) {

        return Promise.reject({
            getPaymentHistoryResponse: err
        });
    }
    return Promise.resolve(returnValue);

}

【问题讨论】:

  • 一个异步函数默认返回一个promise no?你真的需要用承诺包装你的回报吗?
  • 是的,刚刚检查了一些示例,您应该简单地返回值或抛出错误。
  • 是的,这是正确的异步返回承诺,但我尝试只返回对象但它不起作用我试图解决它,但我的问题是它没有达到返回语句
  • 当然没有到达最后一行,你在 try 和 catch 子句中返回了一个承诺,所以它永远不会通过思考。 ps:你可以在使用异步时返回值本身,因为它会将你的响应包装成一个循环的承诺,除非它抛出一个错误,这将返回一个拒绝。
  • try/catch 是不同的操作,只是将数据保存到缓存它不应该阻塞其余代码

标签: javascript typescript asynchronous async-await


【解决方案1】:

使用简单的return 语句作为async 函数默认返回Promise。所以你的返回值等于解析一个值,抛出就是拒绝

try {
        await CacheController.getInstance().saveDetailsWrapper(saveDetails,
            _passedParams);
        return {
            getPaymentHistoryResponse: paymentHistoryDetails
        };
    } catch (err) {
        throw {
            getPaymentHistoryResponse: err
        };
    }

代码不会到达最后一行,因为 try and catch 中有一个 return 语句。

就像你写的一样

if(check) {... return 1}
else {return 2}
return 3

并询问为什么 3 从未返回

更新

我明白 :) 所以 async/await 让您能够以同步的方式编写异步代码。如果你想在不阻塞其他代码的情况下发出请求,那么只需使用简单的thenable 语法:

private combineData(data: any, request: any): any {
    const details: any = [];
    const indexIDs = this.indexIDs;
    delete data.header.IndexOfRequestThatFailed;
    const returnValue = {
        "header": {
            "statusDesc": "",
            "statusCode": "",
            "refID": ""
        },
        "details": details
    }
    as IGetPaymentHistoryResponse;
    const paymentHistoryDetails = {
        header: returnValue.header,
        details: returnValue.details
    };
    // saving details to cache
    const saveDetails = {}
    as ICacheRequest;
    saveDetails.cacheobject = paymentHistoryDetails;
    saveDetails.cachetype = "CombinedPaymentHistoryCache";
    saveDetails.key =
    request.body.getPaymentHistoryRequest.header.serviceContext.tokenID;

    const _passedParams: ILogParams = {}
    as ILogParams;
    _passedParams.refId =
    request.body.getPaymentHistoryRequest.header.serviceContext.refID;
    _passedParams.sessionId =
    request.body.getPaymentHistoryRequest.header.serviceContext.tokenID;
    _passedParams.opname = "getPaymentHistory";
    _passedParams.starttime = moment().toString();
    _passedParams.endtime = "";

    // do not return here to return on the last line
    CacheController.getInstance().saveDetailsWrapper(saveDetails, _passedParams).then(response => ..., err => ...);
    return returnValue;

}

【讨论】:

  • 感谢您的回答,但如果我也想返回 returnValue 会怎样
  • @hussain,哦,等等,什么时候返回最后一行的数据?
  • @hussain 如果saveDetailsWrapper 被拒绝,你想返回returnValue?还是什么时候?
  • 在这两种情况下 returnValue 都应该返回
  • 错误:“IGetPaymentHistoryResponse”类型缺少“Promise”类型的以下属性:然后,catch,[Symb
猜你喜欢
  • 2021-04-27
  • 1970-01-01
  • 2020-09-22
  • 1970-01-01
  • 2020-08-01
  • 2017-10-26
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
相关资源
最近更新 更多