javascript - 当 cachel.delete 分配给变量时,为什么“无法在 'Cache' 上执行 'delete':非法调用”?
问题描述
我试图将cache.delete
本机函数作为参数传递,以使我的代码更容易测试。
但是当我这样做时:
const cacheDeleteFunction = cache.delete;
await cacheDeleteFunction(request);
它失败并Failed to execute 'delete' on 'Cache': Illegal invocation
出现错误。
相同的代码,但直接调用await cache.delete(request)
作品。
另外,如果我这样做:
const cacheDeleteFunction = (x) => cache.delete(x);
await cacheDeleteFunction(request);
然后它也有效!
我试过玩,.apply()
但.call()
他们没有任何区别。
(async () => {
const cache = await caches.open('1');
try {
await cache.add(new Request('?apple'));
await cache.add(new Request('?google'));
} catch (e) {}
const keys = await cache.keys();
for (const request of keys) {
if (request.url.includes('apple')) {
// Failed to execute 'delete' on 'Cache': Illegal invocation
// const cacheDeleteFunction = cache.delete;
// await cacheDeleteFunction(request);
// Works
await cache.delete(request);
// Also works
// const cacheDeleteFunction = (x) => cache.delete(x);
// await cacheDeleteFunction(request);
}
}
})();
我错过了什么?为什么const cacheDeleteFunction = cache.delete;
不起作用?
相关问题:https ://github.com/noahjohn9259/react-clear-cache/pull/36/files
解决方案
问题可能是因为删除函数引用了“this”。因此,当您在不使用 bind 的情况下获得对它的引用时, this 将是未定义的。所以你需要做的是:
const deleteFunction = cache.delete.bind(cache);
推荐阅读
- java - 如何调用私有方法来测试它是否有 Tuple5 参数?
- mysql - 如何在 golang 中获取 MySQL 的 BIT(64)
- java - 数组无意中连续填充在开关盒内
- android - 如何在 ViewPager 中将数据从父 Fragment 通信/发送到子 Fragment?
- ruby-on-rails - Vips - 在图像顶部添加文本,在 Ruby 中调整大小后
- c# - 如何使用 .Net framework 4.6 应用程序中托管的登录页面对 .Net Core 3.1 上的 IdentityServer4 应用程序进行身份验证?
- python - 使用 R 和 ggplot,我将如何绘制具有多个时间值的 3 个变量的数据
- keras - pytorch 中是否有 _keras_shape 的等价物?
- html - 如何使用 Google Docs API 从 Google Doc 获取 HTML?
- python - 使用 Kivy 框架,如何不断更新在 5 个来源之间旋转的图像?