You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测Promise是否已fulfilled?基于fetch与setInterval的轮询场景

解决方案:终止轮询并处理Promise完成状态

原生JavaScript Promise并没有暴露可直接读取的状态属性(比如pending/fulfilled),所以不要尝试直接检测状态,更合理的做法是利用Promise的回调机制来终止轮询,或者封装一个带状态跟踪的Promise包装器。

方法1:直接利用Promise回调终止轮询(推荐)

这是最简洁的实现方式,不需要额外跟踪状态,当fetch的Promise成功resolve时,直接清除定时器终止轮询:

function startPolling() {
  // 保存定时器ID,用于后续终止
  const intervalId = setInterval(() => {
    fetch('/target-api-url')
      .then(response => {
        // 服务器响应成功,立刻终止轮询
        clearInterval(intervalId);
        // 这里处理响应数据,比如转成JSON
        return response.json();
      })
      .then(data => {
        console.log('拿到服务器返回数据:', data);
      })
      .catch(error => {
        // 请求失败时可以选择继续轮询,或者根据错误类型终止
        console.error('请求失败,继续轮询:', error);
      });
  }, 1000);

  // 返回定时器ID,允许外部手动终止轮询
  return intervalId;
}

// 启动轮询
const pollingId = startPolling();
// 如需手动终止:clearInterval(pollingId);

方法2:封装带状态跟踪的Promise(如果需要主动判断状态)

如果你的业务逻辑确实需要在其他地方判断Promise的状态,可以自己封装一个包含状态的对象,在Promise的then/catch回调里更新状态:

// 封装一个带状态跟踪的Promise工具函数
function createTrackedPromise(originalPromise) {
  let status = 'pending';
  let result = null;

  const trackedPromise = originalPromise
    .then(res => {
      status = 'fulfilled';
      result = res;
      return res;
    })
    .catch(err => {
      status = 'rejected';
      result = err;
      throw err;
    });

  return {
    promise: trackedPromise,
    getStatus: () => status,
    getResult: () => result
  };
}

// 带状态跟踪的轮询实现
function startPollingWithStatus() {
  let currentPromise = null;
  const intervalId = setInterval(() => {
    // 只有当前没有pending的请求时,才发起新请求
    if (!currentPromise || currentPromise.getStatus() !== 'pending') {
      currentPromise = createTrackedPromise(fetch('/target-api-url'));
      
      currentPromise.promise
        .then(response => {
          clearInterval(intervalId);
          console.log('服务器响应成功,终止轮询:', response);
        })
        .catch(err => {
          console.error('请求失败:', err);
        });
    }
  }, 1000);
}

关键说明

  • 原生Promise没有公开的状态属性,这是设计上的选择,避免开发者写出依赖状态检测的不规范代码。
  • 优先使用方法1,通过Promise的回调来控制轮询生命周期,代码更简洁且符合Promise的设计意图。

内容的提问来源于stack exchange,提问作者Sundozer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 03:40:16