是否可以覆盖本机 fetch api 以使用所需的 Promise 库而不是本机浏览器 Promise?
Posted
技术标签:
【中文标题】是否可以覆盖本机 fetch api 以使用所需的 Promise 库而不是本机浏览器 Promise?【英文标题】:Is it possible to override native fetch api to use a desired Promise library instead of native browser Promise? 【发布时间】:2016-05-23 21:04:24 【问题描述】:这就是我的意思。
如果浏览器原生支持fetch api(例如Chrome),那么它使用原生浏览器Promise
。
如果我使用另一个 Promise 库(例如 bluebird),原生 fetch
仍然没有使用它——而是使用原生 Promise
实现。
有没有办法覆盖它?
问题示例:
window.Promise = function () return null; ;
fetch('/api')
.then(function (res)
console.log('fetch result!', res); // still works because it uses native Promise
);
我为什么需要它,您可能想知道?我希望使用 bluebird
库支持的 global rejection events 和原生 Promises 所没有的。
【问题讨论】:
浏览器不关心你是否使用了一个promise库,它只知道它自己的promise。它不会自动更改为不同的实现。 【参考方案1】:这里有一些与@MinusFour 建议的代码相同的代码。如果您在浏览器中而不是在模块中,请将 global
替换为 window
。
const fetch = global.fetch
global.fetch = function()
return Promise.resolve(fetch.apply(global, arguments))
【讨论】:
【参考方案2】:您可以在 fetch
承诺上使用 bluebird Promise.resolve()
。它将创建一个同化fetch
promise 的 bluebird promise。
Promise.resolve(Promise|任意值) -> Promise
创建一个使用给定值解决的承诺。如果 value 已经是受信任的 Promise,则按原样返回。如果 value 不是 thenable,则返回已完成的 Promise,并将 value 作为其完成值。如果 value 是 thenable(类似于 Promise 的对象,就像 jQuery 的 $.ajax 返回的对象),则返回一个可信任的 Promise,它吸收了 thenable 的状态。
http://bluebirdjs.com/docs/api/promise.resolve.html
【讨论】:
太棒了!我将fetch
调用包装在一个函数中,并使用了这个sn-p:return Promise.resolve(fetchPromise)
【参考方案3】:
我也发现了这个,并认为在这里发布它可能是有意义的 - https://github.com/github/fetch/issues/417
帖子说(以防链接损坏)- 如果你想在浏览器中使用 bluebird,使用这个,然后
window.fetch = null
window.Promise = 蓝鸟
require('whatwg-fetch') 最新版本的浏览器可能有 fetch API 已经,如果有 fetch API,这个 repo 将返回 false。
如果你想在 node 中使用 bluebird,请使用 node-fetch,并且
let fetch = require('node-fetch');
fetch.Promise = 蓝鸟
【讨论】:
以上是关于是否可以覆盖本机 fetch api 以使用所需的 Promise 库而不是本机浏览器 Promise?的主要内容,如果未能解决你的问题,请参考以下文章
Node-fetch 返回 Promise <pending> 而不是所需的数据 [重复]
如何覆盖DataAnnotations必需标记以允许条件客户端验证
用于获取访问 obiee 目录中特定对象所需的角色/角色的 API