无法在promise.all中检索响应



我正在进行如下的并行调用。

let parllel_call: [Promise<any>, Promise<any>] = [
Function1(xxxxReq),
Function2(yyyyReq),
];
let parllel_call_result = await Promise.all(parllel_call);
console.log('parllel_call_result ', JSON.stringify(parllel_call_result));
let xxxxRes = parllel_call_result[0];
console.log('xxxxRes.status '+xxxxRes.status+' message '+xxxxRes.message+' message '+xxxxRes.data.message);
let yyyyRes = parllel_call_result[1];
console.log('yyyyRes.status '+yyyyRes.status+' message '+yyyyRes.message+' message '+yyyyRes.data.message);

下面是功能1。

async function Function1(xxxxReq) {
console.log("Start - Function1");
await axios
.post(some_url, axxxxReq)
.then(res => {
console.log('response '+res.status+' message '+res.message);
console.log("End - Function1");
return res;
})
.catch(error => {
console.error("error " + error);
console.log("End - Function1");
return error;
});
}

下面是功能2。

async function Function2(yyyyReq) {
console.log("Start - Function2");
await axios
.post(some_other_url, yyyyReq)
.then(res => {
console.log('response '+res.status+' message '+res.data.message);
console.log("End - Function2");
return res;
})
.catch(error => {
console.error("error " + error);
console.log("End - Function2");
return error;
});
}

我能够调用函数1&2并行,并且能够获得函数内的响应。但是,当承诺得到解决,并按照投入的顺序收集响应时,就不会从承诺中收集响应。日志显示null被传递到Promise.all响应数组中。

下面是执行日志。

info: Doing parllel call
Start - Function1
Start - Function2
info: response 200 message undefined
info: End - Function1
info: response 200 message undefined
info: End - Function2
parllel_call_result  [null,null]
error endAssesment TypeError: Cannot read property 'status' of undefined
info: Execution took 14323 ms, user function completed successfully

我在这里错过了什么。

您的async函数不返回任何值,因此它们返回的promise将具有undefined解析值。您所拥有的return语句位于.then().catch()回调中。在顶层没有任何实际设置async函数解析值的返回。您需要返回从await获得的值,或者去掉await,只返回promise。

function Function2(yyyyReq) {
console.log("Start - Function2");
return axios
.post(some_other_url, yyyyReq)
.then(res => {
console.log('response '+res.status+' message '+res.data.message);
console.log("End - Function2");
return res;
})
.catch(error => {
console.error("error " + error);
console.log("End - Function2");
throw error;
});
}

而且,一旦您删除了await并只从axios()调用中返回promise,您就不需要您的函数是async了。

此外,如果您希望.catch()仍然拒绝该承诺,则需要重新抛出错误。


如果要保留async/await,则必须捕获并返回值。

async function Function2(yyyyReq) {
console.log("Start - Function2");
let val = await axios
.post(some_other_url, yyyyReq)
.then(res => {
console.log('response '+res.status+' message '+res.data.message);
console.log("End - Function2");
return res;
})
.catch(error => {
console.error("error " + error);
console.log("End - Function2");
throw error;
});
return val;
}

相关内容

  • 没有找到相关文章

最新更新