允许定义 Promise 构造函数而不是使用全局变量。当前的实现需要使用使用全局变量的polyfill。
例子axios.defaults.promise = PromisePolyfill;
axios.get('/foo');
或者
var axios_instance = axios.create({
promise: PromisePolyfill
});
axios_instance.get('/foo');
允许定义 Promise 构造函数而不是使用全局变量。当前的实现需要使用使用全局变量的polyfill。
例子axios.defaults.promise = PromisePolyfill;
axios.get('/foo');
或者
var axios_instance = axios.create({
promise: PromisePolyfill
});
axios_instance.get('/foo');
@natlibfi-arlehiko 这有什么用例?
只是避免全局变量的一般做法。例如,如果不支持 Promise,并且仅在模块范围内创建 polyfill,如下所示:
define(['some-promise-polyfill', 'axios'], function(Promise, axios) {
axios.defaults.promise = Promise;
axios.get('/foo');
});
这说得通。我很乐意接受 PR。
好的,我会开始研究它。
我不明白想要排除Promise
在全球范围之外的原因。
好吧,在我看来,你想要控制 Polyfill 的使用方式和时间。如果您要为本机行为提供自定义实现,您想知道软件的哪些部分可以做到这一点。
但仔细研究了如何实现本期所描述的功能后,我认为在axios的选项中设置Promise并不合理。也许 polyfill 应该由 axios 加载到每个文件的顶部?现在,由于es6-promise只允许通过修改全局变量(polyfill函数)来选择要使用的实现(Native 或 polyfill),我将对此项目进行无耻的自我引用,它允许您自动选择实现,而无需污染全局命名空间。
+1。如果默认使用全局 Promise 那就太好了,但用户可以重新定义 Promise 实现。例如,在基于 React 的同构应用程序中,人们可能希望在服务器端使用 Bluebird,并使用 es6-polyfill(如果前端不需要 Bluebird 功能,例如地图、过滤器等,那么它会轻得多)。然后他可以将其添加为axios.defaults.Promise = Bluebird
或axios.Promise = Bluebird
。
这是一种广泛认可的模式。参见,例如
虽然您可能会争辩说,可以将其附加到global
或window
对象,但许多开发人员宁愿不这样做并且要明确。
+1 这是我的用例:我在服务器端使用 Bluebird。我还想在服务器端使用 axios 来访问一些外部 REST API。然而,由于我在节点 5 上,axios 返回与默认 Promise 实现一起使用的 Promise,并且每当我想要使用.map
或类似的情况时我都必须包装它们,这很常见。
我的选择是要么修补全局 Promise,要么告诉 axios 使用哪个 Promise 库。我宁愿做后者。
我们需要Promise
像思考一样开始思考Object
。它现在是该语言的核心功能,我们不应该期望库使用不同的实现(因为我们不会对对象、数组、函数或正则表达式这样做)。
如果你想在后端和前端使用不同的 Promise 实现,你可以使用任何一种方式(我想你可以为每个环境拥有特定的 polyfill 文件)。
如果您想使用.map
Bluebird 的其他自定义方法,您可以使用静态版本 ( ),也可以包装 Axios ( )Bluebird.map(promises, fn)
返回的承诺。Bluebird.resolve(axiosPromise).map(fn)
你好@rubennorte,有趣的是,在你关闭这个问题的同时,我正在做 PR。我很高兴看到 Promise 现在成为了原生功能,但我仍然认为有理由让 Promise 可插入。
感谢您和团队在 axios 上所做的工作以及您的考虑。
@rubennorteaxios
支持 IE8+。你不能说 Promise 是一个本机功能,除非axios
放弃对所有未本机实现它们的浏览器的支持。
例如,我最近有一个用例,我无法重新定义全局变量,因为我不拥有环境(正在开发一个小部件),但我还必须支持本身不支持 Promise 的浏览器。所以代码只会压垮axios
.我唯一能做的就是控制小部件中的所有代码使用哪个 Promise 库。我无法做到这一点axios
。所以我不得不使用另一个 xhr 库。