【问题标题】:Axios async/await flowAxios 异步/等待流程
【发布时间】:2020-09-23 19:27:53
【问题描述】:

我同时涉足 Axios 和 async/await 的领域,并试图了解有关控制流的一些信息。以下是合法的吗?

let loading=true;
(async() => {
  let response = null;
  try {
    response = await axios.get('https://whatever.com/api');
  } finally {
    loading=false;
  }
  if(response){
    //do something with response here
  }
  
  
})();

也就是说,我可以指望在我访问响应变量时返回的请求吗?我很感激我可以通过在 axios 获取后立即将其移入“尝试”来保证它,但是我必须在它之前以及“最终”(或“捕获”)中添加 loading=false 行。在任何进一步的操作之前,我需要确保加载设置为 false,无论请求成功还是失败,我不想重复自己。也许有更好的方法来做到这一点?

【问题讨论】:

    标签: async-await axios


    【解决方案1】:

    编辑

    现在您已经更改了问题,之前的解决方案将无法正常工作。问题是 IIFE 内部的代码将在其他所有内容完成后执行,因此从外部代码的角度来看,loading 永远不会设置为false。 (其他代码将被执行,然后是 IIFE。这是因为事件循环)。最好的办法是让外部代码异步并等待 axios 承诺。

    如果您提供问题详细信息,我或许可以帮助您重构它。

    上一个答案

    我需要确保在任何进一步操作之前将 loading 设置为 false

    await 之后的任何代码都保证不会被加载:

    (async() => {
      let response = await axios.get('https://whatever.com/api');  
      // the request is finished, the await guarantees that
    })();
    

    如果您需要错误处理,可以将其包装在 try/catch 中:

    (async() => {
      try {
         let response = await axios.get('https://whatever.com/api');
         // definitely not loading
      }
      catch (e) {
         // definitely not loading, but an error occurred
      }
    })();
    

    【讨论】:

    • 抱歉,不清楚这是什么意思。你是说我的代码能正常工作吗? (你会注意到,我确实使用了 try/finally 结构,但不要使用 catch,因为查看响应变量会显示是否存在错误(即,它是否仍然为 null)。跨度>
    • 您的代码将正常工作,我只是消除了复杂性。我提供的第一个 sn-p 将与您的代码一样完全执行,只是删除了所有不必要的变量和 ifs。
    • 那么我应该把loading=false放在哪里?这就是我的观点。看来,从你拥有它的方式来看,我需要在 let response = await... 和 catch 块中都有它。
    • 你不需要那个变量,因为它是本地的——它不会逃脱 IIFE。带有await 的行后面的代码不能永远loading=true。这就是我删除它的原因。这就是 async-await 的行为方式。
    • 啊,好吧,我明白你的意思了。我的例子写得不好。 'loading' 变量应该在 IIFE 之前(外部)定义。无论请求是否成功完成,我都需要在任何进一步操作之前将 loading 设置为 false。我关心的只是如何避免在两个执行路径中重复“loading=false”。没什么大不了的,就是有点乱。
    猜你喜欢
    • 2019-01-04
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 2019-06-30
    • 2018-02-15
    • 2021-08-25
    • 2023-03-30
    相关资源
    最近更新 更多