[axios]功能请求:自定义 Promise 构造函数

2024-05-15 395 views
7

允许定义 Promise 构造函数而不是使用全局变量。当前的实现需要使用使用全局变量的polyfill。

例子
axios.defaults.promise = PromisePolyfill;
axios.get('/foo');

或者

var axios_instance = axios.create({
  promise: PromisePolyfill
});

axios_instance.get('/foo');

回答

6

@natlibfi-arlehiko 这有什么用例?

1

只是避免全局变量的一般做法。例如,如果不支持 Promise,并且仅在模块范围内创建 polyfill,如下所示:

define(['some-promise-polyfill', 'axios'], function(Promise, axios) {

 axios.defaults.promise = Promise;
 axios.get('/foo');

});
9

这说得通。我很乐意接受 PR。

6

好的,我会开始研究它。

5

我不明白想要排除Promise在全球范围之外的原因。

2

好吧,在我看来,你想要控制 Polyfill 的使用方式和时间。如果您要为本机行为提供自定义实现,您想知道软件的哪些部分可以做到这一点。

但仔细研究了如何实现本期所描述的功能后,我认为在axios的选项中设置Promise并不合理。也许 polyfill 应该由 axios 加载到每个文件的顶部?现在,由于es6-promise只允许通过修改全局变量(polyfill函数)来选择要使用的实现(Native 或 polyfill),我将对此项目进行无耻的自我引用,它允许您自动选择实现,而无需污染全局命名空间。

7

+1。如果默认使用全局 Promise 那就太好了,但用户可以重新定义 Promise 实现。例如,在基于 React 的同构应用程序中,人们可能希望在服务器端使用 Bluebird,并使用 es6-polyfill(如果前端不需要 Bluebird 功能,例如地图、过滤器等,那么它会轻得多)。然后他可以将其添加为axios.defaults.Promise = Bluebirdaxios.Promise = Bluebird

这是一种广泛认可的模式。参见,例如

虽然您可能会争辩说,可以将其附加到globalwindow对象,但许多开发人员宁愿不这样做并且要明确。

4

+1 这是我的用例:我在服务器端使用 Bluebird。我还想在服务器端使用 axios 来访问一些外部 REST API。然而,由于我在节点 5 上,axios 返回与默认 Promise 实现一起使用的 Promise,并且每当我想要使用.map或类似的情况时我都必须包装它们,这很常见。

我的选择是要么修补全局 Promise,要么告诉 axios 使用哪个 Promise 库。我宁愿做后者。

2

我们需要Promise像思考一样开始思考Object。它现在是该语言的核心功能,我们不应该期望库使用不同的实现(因为我们不会对对象、数组、函数或正则表达式这样做)。

如果你想在后端和前端使用不同的 Promise 实现,你可以使用任何一种方式(我想你可以为每个环境拥有特定的 polyfill 文件)。

如果您想使用.mapBluebird 的其他自定义方法,您可以使用静态版本 ( ),也可以包装 Axios ( )Bluebird.map(promises, fn)返回的承诺。Bluebird.resolve(axiosPromise).map(fn)

6

你好@rubennorte,有趣的是,在你关闭这个问题的同时,我正在做 PR。我很高兴看到 Promise 现在成为了原生功能,但我仍然认为有理由让 Promise 可插入。

感谢您和团队在 axios 上所做的工作以及您的考虑。

8

@rubennorteaxios支持 IE8+。你不能说 Promise 是一个本机功能,除非axios放弃对所有未本机实现它们的浏览器的支持。

例如,我最近有一个用例,我无法重新定义全局变量,因为我不拥有环境(正在开发一个小部件),但我还必须支持本身不支持 Promise 的浏览器。所以代码只会压垮axios.我唯一能做的就是控制小部件中的所有代码使用哪个 Promise 库。我无法做到这一点axios。所以我不得不使用另一个 xhr 库。