【问题标题】:Set timeout for external API in Promise resolve在 Promise 解析中为外部 API 设置超时
【发布时间】:2021-06-29 01:59:44
【问题描述】:

我有一个 API,它返回一些值并依赖于我想创建一个数组并将该数组传递给解析的值。它在为解析设置超时时起作用,例如,我在 5 秒内设置了5000 sec,它会获取数据、推送数组并解析。但我不想设置超时。请参阅 cmets 以获得更好的理解。它是一个 nodejs 函数。

const calculateTotal = (arr) => {
  let clientHotspotsTotal = [];
  return new Promise((resolve, reject) => {
    arr.forEach((data) => {      
      axios.get(`enpoint/data?.address`)
        .then((response) => {
          if (response?.data) {
            console.log('API SUCCESS');
            const val = (response?.data?.data?.total * data?.percentage) / 100;            
            clientHotspotsTotal.push({
              total: val,
            });
          } else {
            reject('API failed!');
          }
        })
        .catch((error) => {
          throw new Error(error);
        });
    });
    resolve(clientHotspotsTotal);     ///         it return empty [], cause no time set for wait
    setTimeout(() => {
       resolve(clientHotspotsTotal)      //   it doesn't return empty because in that time api fetch data 
                                             an push into array
    }, 5000)
  });
};

所以我的问题是,当我为多个用户运行 for 循环时,如何等待多个请求的 API 响应。

【问题讨论】:

  • 您正在寻找 Promise.all()。基本上:let clientHotspotsTotal = await Promise.all(arr.map(data => axios.get(...)));(请注意,您当前的代码似乎没有在任何地方使用数组元素;如果您想将data 插入到 URL 中,您必须实际这样做)
  • 你可以在axios请求的then块中解决promise

标签: javascript node.js async-await promise es6-promise


【解决方案1】:

您可以通过使用 async / await 和 Promise.all 大大简化此操作。我们可以从 axios 调用中创建一个 Promise 数组,然后使用 Promise.all 获取响应数据。

然后我们遍历响应,返回结果。

const calculateTotal = async (arr) => {
  const responses = await Promise.all(arr.map(data => axios.get(`enpoint/${data?.address}`)));
  const clientHotspotsTotal = responses.map((response, i) => {
    return({ total: (response?.data?.data?.total * arr[i]?.percentage) / 100});
  });
  return clientHotspotsTotal;
};

async function testIt() {
   let result = await calculateTotal([
     { address: 'someaddress', percentage: 0.50 }, 
     { address: 'someaddress', percentage: 0.75 }
   ]);
   console.log(result);
}

testIt()

【讨论】:

  • reponses return undefined!
  • ` const clientHotspotsTotal = response.map((response, i) => { return({ total: (response?.data?.data?.total * arr[i]?.percentage) / 100}); });`这是不对的,作为回报arr[i],
  • 非常感谢您查看我的回答。如果响应未定义,也许我们调用了错误的 url? enpoint/${data?.address} 是要传递的正确值吗?这应该很容易改变。如果响应未定义,则其余代码肯定无法正常工作,我们需要先修复它!
  • url 即使我更改它也可以,但它仍然返回未定义!
  • 它现在可以工作了,感谢您的时间,可以向我解释 arr[i] 如何在 return 中工作,我认为它不会工作,因为我们没有在这里迭代 arr! const clientHotspotsTotal = responses.map((response, i) => { return({ total: (response?.data?.data?.total * arr[i]?.percentage) / 100}); });
猜你喜欢
  • 1970-01-01
  • 2021-09-12
  • 2014-05-24
  • 2023-04-10
  • 2020-03-21
  • 2019-12-06
  • 2020-02-20
  • 1970-01-01
相关资源
最近更新 更多