使用promise.all的最佳实践是什么?

时间:2018-08-10 16:05:03

标签: javascript api typescript promise

我必须打两次电话并获得合并的响应,因此在下面的代码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]);


   }

3 个答案:

答案 0 :(得分:1)

您的堆栈和存储在if语句内,使它们超出了外部函数的范围。您可以在函数作用域中使用数组来存储在if语句中创建的两个promise。请注意,您必须删除await才能使它们真正返回Promise.all能够解决的诺言

答案 1 :(得分:1)

您的问题有两个:

  1. Promise.all用于只有一个条件为真的情况
  2. 未正确使用await关键字

第一个错误是request.body.lob只能包含一个值。您的承诺在if语句内。因此,其中只有一个被退回。

第二个错误是,由于await关键字,您实际上不是在返回承诺,而是已解决的承诺的值。

您将在stackstore变量中返回承诺的 ,而不是承诺本身。因此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??
  }

}