(另请参阅这个答案。)
当我重新定义Promise
类(使用如下所示的“monkey-patch”)时,这不会影响由本机函数返回的承诺,例如fetch
:
Promise = class extends Promise {
constructor(executor) {
console.log("Promise created");
super(executor);
}
}
console.log("Non-native promise");
Promise.resolve(1);
console.log("Native promise");
fetch("https://httpbin.org/delay/1");
console.log("Native promise");
document.hasStorageAccess();
当我在浏览器中运行此代码片段时,由创建的承诺使用了重新定义(因此记录了“创建的承诺”),但由或Promise.resolve
返回的承诺却没有。fetch
document.hasStorageAccess
(当我在 Node.js 中尝试它时,fetch
使用重新定义,所以它实际上取决于实现。)
有没有办法重新定义,Promise
使得本机浏览器功能也可以使用这种重新定义?
没有(函数也一样)。您可以
async
做的事情包括:改变
Promise.prototype
将返回原生承诺的函数替换为返回承诺类型的包装器
(我不会建议出于任何正常目的做这两件事,包括获取更好的堆栈跟踪以进行错误报告。)
本机浏览器 API 是预编译的,并且独立于 JavaScript 运行时的全局对象(如 Promise)运行。
当你在 JavaScript 中重写 Promise(例如,window.Promise = ...)时,它只会影响 JavaScript 环境。原生 API 会继续使用其内部引用,而忽略被重写的全局 Promise。
对于您来说,您不仅需要对进行 monkey-patch
Promise
,还需要fetch
对任何其他本机 API 进行整体修补,才能实现预期结果。