如何检测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类型的实用方法
- 直接检查返回值是否为Promise
调用API时(在允许无参数的情况下),判断返回值是否包含then方法:
// 检测chrome.contextMenus.removeAll是否支持Promise const isPromiseSupported = typeof chrome.contextMenus.removeAll()?.then === 'function';
注意:部分API要求必须传入参数,这种情况可以结合Chrome官方文档的API说明来确认。
- 封装工具函数自动兼容两种类型
如果想同时适配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
相关产品推荐
相关产品推荐

