当前位置: 首页 > 知识库问答 >
问题:

确保代码在条件下运行两次

傅志诚
2023-03-14

我有代码,需要做的请求一些服务器与令牌,有时你需要运行代码两次以获得数据。 (完全相同的代码)如何确保代码只运行两次,而不是递归运行?

在第一次运行中的大多数时候,我得到http响应401,而第二次运行则得到http 200

这是密码

async function magt() {
let auth: any;
    try {
        auth = await getTokens();
        if (auth.runtime?.status == 200 && auth.application?.status == 200) {
        ...
        //run rest of the code


       } else {
            console.log("unable to fetch tokens")
            if (auth.response.status == 401) {
                console.log("Running for the second time to get valid token")
                await magt()
            }
        }
    } catch (e) {
        console.log("error occurred while fetching token: ", e)

    }

我想确保如果我总是得到401,只运行magt()函数两次,最好的方法是什么?

有没有更好的方法从一些简单的计数器,它是由全局定义的?

共有2个答案

钱渊
2023-03-14
async function magt(iterationLeft) {
    let auth: any;
    iterationLeft--;
    try {
        auth = await getTokens();
        if (auth.runtime?.status == 200 && auth.application?.status == 200) {
        ...
        //run rest of the code


       } else {
            console.log("unable to fetch tokens")
            if (auth.response.status == 401 && iterationLeft) {
                console.log("Running for the second time to get valid token")
                await magt(iterationLeft)
            }
        }
    } catch (e) {
        console.log("error occurred while fetching token: ", e)

    }

以迭代次数为参数进行调用magt(2);

海新霁
2023-03-14

一个简单的for循环怎么样?

async function magt() {
  for (var attempt = 0; attempt < 2; attempt++) {
    try {
      let auth = await getTokens();
      if (auth.runtime?.status == 200 && auth.application?.status == 200) {
        return true;
      }
      console.log("Invalid auth response:", auth.response);
    } catch (e) {
      console.log("error occurred while fetching token: ", e);
    }
  }
  throw new Error("All attempts at magt'ing failed miserably");
}

async function something() {
  await magt();
  //"run rest of the code"
}

或者,如果您觉得更有趣,可以编写一个包装器函数来重试异步函数:

async function retrying(func, attempts) {
  for (let attempt = 0; attempt < attempts; attempt++) {
    try {
      return await func();
    } catch (err) {
      console.log(func, "attempt", attempt, "failed:", err);
    }
  }
  throw new Error("retry failed");
}

async function checkToken() {
  const auth = await getTokens();
  if (auth.runtime?.status == 200 && auth.application?.status == 200) {
    return auth;
  }
  throw new Error("invalid auth response: " + auth.response);
}

async function magt() {
  const token = await retrying(checkToken, 2);
}
 类似资料:
  • 有一种方法可以运行junit测试,只需在“mvn clean install”命令中添加参数?没有使用@Profile注释测试。

  • 我正在Scala中编写一个Spark作业,它读取S3上的parquet文件,执行一些简单的转换,然后将它们保存到DynamoDB实例中。每次运行时,我们都需要在Dynamo中创建一个新的表,所以我编写了一个Lambda函数,它负责表的创建。Spark作业所做的第一件事是生成一个表名,调用我的Lambda函数(将新表名传递给它),等待创建表,然后正常地执行ETL步骤。 但是,看起来我的Lambda函

  • 如何在c: if条件中使用"ft"的值。 以下是我在JSP中使用代码的方法(示例代码) 我的任务说明:需要减去两个日期并检查条件是否大于48小时,该行应高亮显示为绿色,否则精细(无变化)。 所以我从数据库中获取值,并在JSP页面中进行验证,以根据条件突出显示行。

  • 我不知道发生了什么事情。即使条件是假的,if块中的代码仍然运行。我在netbeans IDE7.4中设计了我的界面,只需在Eclipse中复制粘贴设计。以下是我的代码 无论我在jinstrument jcombobox中选择什么,我都会得到“inside if”作为输出。我已经检查了print语句,但enterloop的值为0,它仍然进入if语句块。请帮助我解决这个问题

  • 问题内容: codepad.org允许您在线运行C,C ++,D等代码,但不能运行Java …我可以使用Java的网站吗? 问题答案: 还有http://ideone.com/(支持多种语言)

  • 我似乎一直在尝试在vscode中运行python3文件。我注意到右上角运行代码的三角形按钮也不再是绿色。 我已经为python3建立了自己的venv,并且安装了numpy包——我已经检查了< code>pip list,它在那里,并且在导入时调用这个包中的任何方法时运行良好。 当我右键单击vscode中的文件并单击在终端中运行Python文件时-它运行得非常好,并为我提供了所需的输出。 但是,当我

  • 问题内容: 对于一个学校项目,我正在用Python制作子手游戏。现在,我的代码从字典中选择一个单词,如下所示: 现在,必须在运行之前在代码中设置单词列表,但是我添加了在运行时将单词添加到列表中的功能: 但是,一旦退出代码,显然不会保存添加的单词,因此,我将不得不手动将所有单词添加到列表中,或者每次代码启动后都将一堆单词添加到列表中。所以我想知道是否有一种简单的方法可以在代码完成后保存变量,以便Wo

  • 我想创建一个条件,当用户下订单时,有一个线程运行20秒来检查数据库的支付状态是完成还是挂起,如果完成了,线程将停止,如果仍然挂起,线程将继续运行20秒,并更新数据库中的状态以取消,我使用mybatis和XML映射器 这是我的代码 下面是我在控制器中的代码 这是数据库 它不会显示任何错误,但也不会改变任何东西...