Javascript 是否可以覆盖本机获取api以使用所需的承诺库而不是本机浏览器承诺?

Javascript 是否可以覆盖本机获取api以使用所需的承诺库而不是本机浏览器承诺?,javascript,error-handling,es6-promise,onerror,fetch-api,Javascript,Error Handling,Es6 Promise,Onerror,Fetch Api,这就是我的意思 如果浏览器本机支持(例如Chrome),则它使用本机浏览器Promise 如果我使用另一个Promise库(例如),nativefetch仍然没有使用它-它使用nativePromise实现 有没有办法克服这个问题 问题示例: window.Promise = function () { return null; }; fetch('/api') .then(function (res) { console.log('fetch result!', res); //

这就是我的意思

如果浏览器本机支持(例如Chrome),则它使用本机浏览器
Promise

如果我使用另一个Promise库(例如),native
fetch
仍然没有使用它-它使用native
Promise
实现

有没有办法克服这个问题

问题示例:

window.Promise = function () { return null; };


fetch('/api')
.then(function (res) {
    console.log('fetch result!', res); // still works because it uses native Promise
});

你可能会想,我为什么需要这个?我希望使用
bluebird
库支持和本机承诺没有的功能。

您可以在
fetch
Promise上使用bluebird
Promise.resolve()
。它将创造一个蓝鸟承诺,同化
fetch
promise

承诺。解决(承诺|任何价值)->承诺

创建使用给定值解析的承诺。如果值已经是受信任的承诺,则按原样返回。如果值不是thenable,则返回已履行的承诺,并将值作为其履行值。如果值是一个thenable(Promise-like对象,如jQuery的$.ajax返回的对象),则返回一个可信任的承诺,该承诺将同化thenable的状态


这里有一些代码与@MinusFour建议的代码相同。如果您在浏览器中而不是在模块中,请将
global
替换为
window

const fetch = global.fetch
global.fetch = function() {
    return Promise.resolve(fetch.apply(global, arguments))
}

我也发现了这一点,并认为把它贴在这里可能有意义-

帖子上说(万一链接断了)—— 如果您想在浏览器中使用bluebird,请使用此选项,然后

window.fetch=null

承诺=蓝鸟

require('whatwg-fetch')最新版本的浏览器可能有fetch API 如果存在fetch API,此repo将返回false

如果您想在节点中使用bluebird,请使用node fetch,然后

let fetch=require('node-fetch')

fetch.Promise=蓝鸟


浏览器并不关心您是否使用promise库,它只知道自己的promise。它不会自动更改为其他实现。太棒了!我将
fetch
调用包装在一个函数中,并使用了以下代码片段:
returnpromise.resolve(fetchPromise)