小编Tom*_*vey的帖子

使用 React-Query 钩子有条件地调用 API

我正在使用 react-query 进行 API 调用,在这个问题案例中,我只想在满足某些条件时调用 API。

我有一个输入框,用户可以在其中输入搜索查询。当输入值更改时,将使用输入的内容作为搜索查询调用搜索服务器……但前提是输入值的长度超过 3 个字符。

在我的反应组件中,我正在调用:

const {data, isLoading} = useQuery(['search', searchString], getSearchResults);
Run Code Online (Sandbox Code Playgroud)

我的getSearchResults函数将有条件地进行 API 调用。

const getSearchResults = async (_, searchString) => {
    if (searchString.length < 3)
        return {data: []}

    const {data}  = await axios.get(`/search?q=${searchString}`)
    return data;
}
Run Code Online (Sandbox Code Playgroud)

我们不能在条件中使用钩子 - 所以我将条件放入我的 API 调用函数中。

这几乎有效。如果我输入一个简短的查询字符串,则不会发出 API 请求,并且会返回一个空数组data。好极了!

但是 -isLoadingtrue短暂地翻转- 即使没有发出 HTTP 请求。所以我的加载指示器会在没有实际网络活动时显示。

我是否误解了如何最好地解决我的用例,有没有办法确保isLoading在没有 HTTP 活动的情况下返回 false?

reactjs react-query

13
推荐指数
1
解决办法
6356
查看次数

AWS Cloudwatch 警报状态更改延迟

我有一个警报跟踪单个 ALB 的 LoadBalancer 5xx 错误指标。如果过去 1 中的 1 个数据点高于阈值 2,则应处于“警报”状态。周期设置为 1 分钟。查看报警详情:

在此输入图像描述

世界标准时间 2020 年 9 月 23 日 17:18,负载均衡器开始返回 502 错误。这显示在下面的 Cloudwatch 指标图表中,并且我已确认时间是正确的(这是强制 502 响应,因此我知道何时触发它,并且可以在 ALB 日志中看到 17:18 时间戳)

在此输入图像描述

但在警报日志中,“警报中”状态仅在 17:22 UTC 触发,即 17:18 期间出现超过 2 个错误的 4 分钟后。这不是接收通知的延迟 - 这是与我的预期相比状态更改的延迟。状态更改后几秒钟内即可正确接收通知。

这是带有状态更改时间戳的警报日志: 在此输入图像描述

我们认为缺失数据是好的,因此根据指标图,我认为它应该在 17:22 恢复正常(在 17:21 期间出现 0 个错误之后),但仅在 17:27 延迟 5 分钟时恢复正常。

然后我预计它会在 17:24 恢复为“警报”,但直到 17:28 才恢复。

最后,我预计它会在 17:31 恢复正常,但直到 17:40 才恢复正常,整整过了 9 分钟。

为什么我预期状态转换与实际发生之间有 4-9 分钟的延迟?

monitoring amazon-web-services amazon-cloudwatch

7
推荐指数
1
解决办法
6878
查看次数

Fargate 任务上是否自动设置任何环境变量

我\xe2\x80\x99d 希望能够检测我的代码是否在 Fargate 任务上运行(而不是在 EC2 实例上),如果我可以从环境变量获取 Fargate 任务 ID,那将是理想的选择。

\n

然后我将使用此信息进行日志记录和配置。

\n

许多 CI 环境设置了一些环境变量,允许我检测我的代码是否在 CI 中。

\n

AWS有类似的事情吗?

\n

amazon-web-services amazon-ecs aws-fargate

6
推荐指数
1
解决办法
6995
查看次数

重试时celery何时调用on_failure

我在 celery 中使用任务继承max_retries: 3来重试( )某些异常并记录失败。

on_failure在每次失败的尝试时调用还是仅在最后一次尝试(在我的例子中是第三次)之后调用?

def __call__(self, *args, **kwargs):
        try:
            return self.run(*args, **kwargs)
        except InterfaceError as exc:
            self.retry(exc=exc, countdown=5, max_retries=3)

def on_failure(self, exc, task_id, args, kwargs, einfo):
    log(exc)  # This is a gross simplification of the logging
Run Code Online (Sandbox Code Playgroud)

python celery

2
推荐指数
1
解决办法
1026
查看次数