(Veja também esta resposta .)
Quando eu redefini a Promise
classe (com um "monkey-patch" como mostrado abaixo), isso não afeta as promessas que são retornadas por uma função nativa como 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();
Quando executo esse snippet no navegador, a promessa criada por Promise.resolve
usa a redefinição (de modo que "Promessa criada" é registrada), mas as promessas retornadas por fetch
ou document.hasStorageAccess
não.
(Quando tento no Node.js, fetch
ele usa a redefinição, então realmente depende da implementação.)
Existe uma maneira de redefinir Promise
de forma que a redefinição também seja usada pelas funções nativas do navegador?
Não, não há (e o mesmo vale para
async
funções). Coisas que você pode fazer incluem:alterando
Promise.prototype
substituindo as funções que retornam promessas nativas por wrappers que retornam seu tipo de promessa
(Eu não recomendaria fazer nenhuma dessas coisas para nenhuma finalidade normal, incluindo obter melhores rastreamentos de pilha para relatórios de erros.)
As APIs nativas do navegador são pré-compiladas e operam independentemente dos objetos globais do tempo de execução do JavaScript, como Promise.
Quando você substitui Promise em JavaScript (por exemplo, window.Promise = ...), isso afeta apenas o ambiente JavaScript. APIs nativas continuam a usar suas referências internas, ignorando a Promise global substituída.
No seu caso, você terá que aplicar monkey-patch não apenas no
Promise
, mas tambémfetch
em qualquer outra API nativa como um todo para atingir o resultado pretendido.