我必须进行两次调用并获得统一的响应,所以在下面的代码中,Promise.all不会被调用,我不知道实现错误的地方是什么,我想知道在下面的场景中使用Promise.all实现这两个请求响应的最佳实践或方法。
我在下面的代码中使用tsoa格式的typescript。
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]);
}发布于 2018-08-11 00:09:03
您的堆栈和存储都在if语句中,这使得它们超出了外部函数的作用域。可以在函数作用域中使用数组来存储在if语句中创建的两个promises。请注意,您必须删除等待,才能让它们实际返回Promise.all能够解析的承诺
发布于 2018-08-11 00:28:45
你的问题有两个方面:
在使用await关键字
await时,只有一个条件可以为真时,则使用
Promise.all第一个错误是request.body.lob只能保存一个值。您的承诺包含在if语句中。因此,它们中只有一个会被返回。
第二个错误是,由于关键字await,您实际上并没有返回promise,而是返回了已解析promise的值。
您将在stack和store变量中返回promise的值,而不是promises本身。因此,Promise.all不能为您做任何事情,因为那里没有存储未完成的承诺。
通过将promise存储在变量中来解决这个问题,并以不同的方式执行条件语句。
发布于 2018-08-11 00:26:56
似乎您所需要的只是一个请求,并根据条件设置url。
@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??
}
}https://stackoverflow.com/questions/51790282
复制相似问题