Как решить Promise, используя функцию async / await? - PullRequest
0 голосов
/ 15 января 2019

Я попытался поймать, как только решено, мой код не достигает последнего возврата 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);

}

1 Ответ

0 голосов
/ 15 января 2019

Используйте простой оператор return, так как async функция возвращает Promise по умолчанию. Таким образом, ваше возвращаемое значение равно разрешению значения, а выбрасывание - отклонение

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

Код не достигнет последней строки, потому что есть оператор return в try и catch.

Это как ты пишешь

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

И спросите, почему 3 никогда не возвращается

Обновление

Я понял :) Так что async / await дает вам возможность писать асинхронный код синхронно. Если вы хотите сделать запрос без блокировки другого кода, просто используйте простой синтаксис then:

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;

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...