6

这就是我的意思。

如果浏览器原生支持fetch api(例如 Chrome),那么它使用原生浏览器Promise

如果我使用另一个 Promise 库(例如bluebird),nativefetch仍然没有使用它——它使用的是本地Promise实现。

有没有办法覆盖它?

问题示例:

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


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

为什么我需要那个,你可能想知道?我希望使用库支持和原生 Promises 没有的全局拒绝事件。bluebird

4

3 回答 3

4

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

const fetch = global.fetch
global.fetch = function() {
    return Promise.resolve(fetch.apply(global, arguments))
}
于 2016-03-13T16:56:59.000 回答
3

Promise.resolve()你可以在fetch承诺上使用蓝鸟。它将创建一个同化承诺的蓝鸟fetch承诺。

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

于 2016-02-12T16:25:27.900 回答
0

我也发现了这个,并认为在这里发布它可能是有意义的 - https://github.com/github/fetch/issues/417

帖子说(以防链接损坏)-如果您想在浏览器中使用蓝鸟,请使用它,并且

window.fetch = null

window.Promise = 蓝鸟

require('whatwg-fetch') 最新版本的浏览器可能已经有 fetch API,如果有 fetch API,这个 repo 将返回 false。

如果你想在 node 中使用 bluebird,请使用 node-fetch,并且

让 fetch = require('node-fetch');

fetch.Promise = 蓝鸟

于 2018-06-09T11:32:48.843 回答