是否可以覆盖本机 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必需标记以允许条件客户端验证

iPhone中所有设备覆盖屏幕所需的图像大小

用于获取访问 obiee 目录中特定对象所需的角色/角色的 API

Fused Location API 所需的最低播放服务版本

LibVLCSharp:“无法加载所需的本机库。”