javascript - 如何使用 async/await 函数解决 Promise?
问题描述
一旦解决了我的代码并没有达到最后一次返回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);
}
解决方案
使用简单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 让你能够以同步的方式编写异步代码。如果你想在不阻塞其他代码的情况下发出请求,那么只需使用简单的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;
}
推荐阅读
- ios - 使用动画将 UIView 移动或捕捉到屏幕的另一侧
- php - 我可以在 ReactJS 中使用 PHP 发送表单吗?
- ios - iOS 上用于非拉丁脚本的默认字体列表?
- php - Google Drive PHP v3 API 文件元数据
- ubuntu-18.04 - KNIME 可以像 React 项目一样在 DevSpace 中使用吗?
- github - 发布到 Artifact 中的单独文件夹(GitHub 操作)
- json - 如何在没有 alamofire 的情况下从登录中获取 JSON 数据
- django - Django 在同一查询中获得一对多
- c - 每年复利并取出资金
- php - PHP:我想通过 CURL 一起发送 json 和二进制数据