首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用promise.all的最佳实践是什么?

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

Stack Overflow用户
提问于 2018-08-11 00:05:03
回答 3查看 708关注 0票数 0

我必须进行两次调用并获得统一的响应,所以在下面的代码中,Promise.all不会被调用,我不知道实现错误的地方是什么,我想知道在下面的场景中使用Promise.all实现这两个请求响应的最佳实践或方法。

我在下面的代码中使用tsoa格式的typescript。

main.ts

代码语言:javascript
复制
   @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]);


   }
EN

回答 3

Stack Overflow用户

发布于 2018-08-11 00:09:03

您的堆栈和存储都在if语句中,这使得它们超出了外部函数的作用域。可以在函数作用域中使用数组来存储在if语句中创建的两个promises。请注意,您必须删除等待,才能让它们实际返回Promise.all能够解析的承诺

票数 1
EN

Stack Overflow用户

发布于 2018-08-11 00:28:45

你的问题有两个方面:

在使用await关键字

  • await

时,只有一个条件可以为真时,则使用

  1. Promise.all

第一个错误是request.body.lob只能保存一个值。您的承诺包含在if语句中。因此,它们中只有一个会被返回。

第二个错误是,由于关键字await,您实际上并没有返回promise,而是返回了已解析promise的值。

您将在stackstore变量中返回promise值,而不是promises本身。因此,Promise.all不能为您做任何事情,因为那里没有存储未完成的承诺。

通过将promise存储在变量中来解决这个问题,并以不同的方式执行条件语句。

票数 1
EN

Stack Overflow用户

发布于 2018-08-11 00:26:56

似乎您所需要的只是一个请求,并根据条件设置url。

代码语言:javascript
复制
@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??
  }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51790282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档