Javascript 是否可以覆盖本机获取api以使用所需的承诺库而不是本机浏览器承诺?
这就是我的意思 如果浏览器本机支持(例如Chrome),则它使用本机浏览器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); //
Promise
如果我使用另一个Promise库(例如),nativefetch
仍然没有使用它-它使用nativePromise
实现
有没有办法克服这个问题
问题示例:
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上使用bluebirdPromise.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)