我必须打两次电话并获得合并的响应,因此在下面的代码Promise.all中不会被调用任何想法,是什么实现了错误,我想知道以下情况下的最佳实践或方法,以实现使用Promise的两个请求响应。全部。
我在下面的代码中使用tsoa格式的打字稿。
main.ts
@Post("getStoreDetails")
public async getStoreDetail(@Body() request: express.Request): Promise < any > {
const stackurl = "http://staclurl"
const storeurl = "http://storeurl"
if (request.body.lob === "Stack") {
const stack: any = await axios.post(stackurl, req.body).then(
function(res) {
if (res.data.Header.StatusCode !== '0000') {
throw res.data.Header;
}
const Stackresponse = res.data.Details;
return Stackresponse;
});
}
if (request.body.lob === "Admin") {
const store: any = await axios.post(storeurl, req.body).then(
function(res) {
if (res.data.Header.StatusCode !== '0000') {
throw res.data.Header;
}
const StoreResponse = res.data.Details;
return StoreResponse;
});
}
return Promise.all([stack, store]);
}
答案 0 :(得分:1)
您的堆栈和存储在if语句内,使它们超出了外部函数的范围。您可以在函数作用域中使用数组来存储在if语句中创建的两个promise。请注意,您必须删除await才能使它们真正返回Promise.all能够解决的诺言
答案 1 :(得分:1)
您的问题有两个:
Promise.all
用于只有一个条件为真的情况await
关键字第一个错误是request.body.lob只能包含一个值。您的承诺在if语句内。因此,其中只有一个被退回。
第二个错误是,由于await
关键字,您实际上不是在返回承诺,而是已解决的承诺的值。
您将在stack
和store
变量中返回承诺的值 ,而不是承诺本身。因此Promise.all对您无能为力,因为那里没有存储任何未完成的承诺。
通过将promise存储在变量中来解决此问题,并以其他方式处理条件。
答案 2 :(得分:0)
似乎您只需要一个请求并根据条件设置网址
@Post("getStoreDetails")
public async getStoreDetail(@Body() request: express.Request): Promise < any > {
const urls = {
'Stack': "http://staclurl",
'Admin': "http://storeurl"
}
const url = urls[request.body.lob];
if (url) {
return await axios.post(url, req.body).then(
function(res) {
if (res.data.Header.StatusCode !== '0000') {
throw res.data.Header;
}
return res.data.Details;
});
}else{
// what to return if no matching url??
}
}