【问题标题】:Cancel API call when modal closes - React模式关闭时取消 API 调用 - React
【发布时间】:2020-07-02 21:06:46
【问题描述】:

我有一个条件,即我每 2.5 秒一直获取 API,直到解决所提到路径中的数据。我在模态中使用它。每 2.5 秒调用一次,直到数据被解析。但是,如果数据未解析并且我计划关闭模式,则仍在进行 API 调用。如何清除超时并在模式的关闭按钮单击时停止 API 调用?请指教。另外,如果 API 在第 5 次尝试中没有解决,我想拒绝它。

const getData = (url, path) => {
    return new Promise((resolve, reject) => {
        try {
            const loop = (async () => {
                const result = await axios.get(url);
                if (_.has(result.data, path) && result.data[path]) {
                    resolve(result.data[path]); // Resolve with the data
                    return; // Stop the loop
                }
                setTimeout(loop, 2500);
            })();
        } catch (e) {
            reject(e)
        }
    });
}

(async() => {
  const version = await getData('https://api.oceandrivers.com/static/resources.json', 'swaggerVersion');
  console.log(version);
})();
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>

我应该在哪里放置 clearInterval?请指教。

【问题讨论】:

    标签: javascript reactjs async-await settimeout cleartimeout


    【解决方案1】:

    您应该在模式卸载时清除超时。您可以通过在模态组件中使用 useEffect 挂钩来执行此操作,然后执行以下操作:

    const timeout = setTimeout(loop, 2500)
    useEffect(()=>{return clear timeout(timeout)},[]);
    

    抱歉代码格式化,我在移动设备上。

    【讨论】:

    • 我无法访问方法循环作为其内部的 getData 方法。
    • 更新了答案
    • 我明白这一点。但我确实想清除getData中的循环方法
    • 然后将回调传递给 getData,该回调会在模式卸载时被调用并清除超时
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    • 2020-05-18
    相关资源
    最近更新 更多