如何序列化返回Promise的JavaScript函数数组?适配IE11环境
我明白你的困扰了——让返回Promise的函数按顺序执行还得兼容IE11确实有点棘手,不过咱们一步步来解决问题。
首先得指出你现有代码里的核心问题:
- 你直接把
fn("3")这类调用push进数组时,这些函数已经立即执行了,根本没等前一个完成,这也是Promise.all无法保证顺序的原因——你提前把所有函数都跑起来了。 - 你的
reduce用法有误:逗号运算符的写法破坏了Promise链的串联,初始Promise的处理也没做好,导致顺序逻辑失效。
正确的实现思路
我们可以用Array.prototype.reduce来构建一个严格顺序的Promise链,核心要点:
- 数组里存待执行的函数(带参数),而不是已执行的Promise实例,这样才能让它们在链中依次触发。
- 用
Promise.resolve()作为reduce的初始值,每一步都在前一个Promise完成后,调用当前函数并返回它的Promise,以此保证顺序。
兼容IE11的完整代码
<script> // 你的原函数,保持不变 var fn = function(arg) { return new Promise(function(resolve, reject) { console.log("fn(" + arg + ")..."); resolve("OK"); }); }; // 关键:数组里存的是函数,不是直接调用fn的结果! var chain = [ function() { return fn("10"); }, function() { return fn("20"); }, function() { return fn("30"); } ]; // 用reduce构建顺序执行的Promise链 var sequencePromise = chain.reduce(function(prevPromise, currentFn) { return prevPromise.then(function() { // 前一个Promise完成后,执行当前函数并返回它的Promise return currentFn(); }); }, Promise.resolve()); // 初始值:一个已resolved的Promise,作为链的起点 // 所有函数执行完成后的回调 sequencePromise.then(function() { console.log("All functions executed in order!"); }).catch(function(err) { console.error("Error occurred during execution:", err); }); console.log("Building execution sequence, functions will run in order..."); </script>
额外注意(针对IE11)
IE11原生不支持Promise,所以你需要提前引入Promise的polyfill(比如es6-promise),否则代码在IE11中会直接报错。
内容的提问来源于stack exchange,提问作者paulsm4
相关产品推荐
相关产品推荐

