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

如何检测Chrome API是Promise类型还是Callback类型?

如何检测Chrome Manifest V3 API的类型(Callback/Promise)

逐个检查Chrome版本来判断API支持Callback还是Promise显然不现实,比如chrome.contextMenus.removeAll()目前仍属于Callback类型(未来可能会转为Promise)。

两种调用方式对比:
Callback写法:

chrome.contextMenus.removeAll(() => chrome.contextMenus.create(item));

Promise写法:

chrome.contextMenus.removeAll()
.then(() => chrome.contextMenus.create(item));

用错调用方式会直接报错:

  • 在尚未支持Promise的API上调用then(),会抛出:
TypeError: Cannot read properties of undefined (reading 'then')
  • 在已转为Promise的API上传入Callback参数,会抛出:
Uncaught SyntaxError: Unexpected token ')'

检测API类型的实用方法

  1. 直接检查返回值是否为Promise
    调用API时(在允许无参数的情况下),判断返回值是否包含then方法:
// 检测chrome.contextMenus.removeAll是否支持Promise
const isPromiseSupported = typeof chrome.contextMenus.removeAll()?.then === 'function';

注意:部分API要求必须传入参数,这种情况可以结合Chrome官方文档的API说明来确认。

  1. 封装工具函数自动兼容两种类型
    如果想同时适配Callback和Promise风格的API,可以写一个简单的封装函数,不用手动判断:
function wrapChromeApi(api) {
  return function(...args) {
    const result = api(...args);
    // 检查是否返回Promise
    if (result && typeof result.then === 'function') {
      return result;
    }
    // 否则转为Promise格式
    return new Promise((resolve, reject) => {
      // 确认API是否需要Callback参数
      if (api.length > args.length) {
        api(...args, (response) => {
          if (chrome.runtime.lastError) {
            reject(chrome.runtime.lastError);
          } else {
            resolve(response);
          }
        });
      } else {
        resolve(result);
      }
    });
  };
}

// 使用示例
const safeRemoveAll = wrapChromeApi(chrome.contextMenus.removeAll);
safeRemoveAll()
  .then(() => chrome.contextMenus.create(item))
  .catch(err => console.error('操作失败:', err));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 08:40:25