let p = function () { return new Promise((resolve, reject) => { setTimeout(() => { resolve(1) }, 2000) }) } let p2 = function () { return new Promise((resolve, reject) => { setTimeout(() => { resolve(2) }, 1000) }) } let p3 = function () { return new Promise((resolve, reject) => { setTimeout(() => { resolve(3) }, 500) }) } function reducePromise(promises) { // 创建一个promise 对象 let sequence = Promise.resolve(); // 用来接收异步返回结果 let resData = [] promises.forEach(item => { // 第一个then 执行我们传入的异步请求函数 // 第二个then 用来 获取执行后返回的结果,因为我们的异步函数也是一个promise // 这样的作用 就能够用promise.resolve创造一个resolve状态的promise 通过then方法 将所有 调用连接在一起 sequence = sequence.then(item).then(v => { resData.push(v) }) // 第一次循环执行完毕后,后面再执行 都会基于前一个promise结果 // 执行完毕后再执行。 // 这样依次循环完毕后 就可以想象成一条链。后一个异步函数都会等待上一个函数执行完毕后再执行 }) // 方便后续能够继续通过链式调用的方式 获取上面所有异步方法的返回值 return new Promise((resolve, reject) => { // 最后再次添加一个 异步函数等待前面所有异步函数执行完毕,将我们的返回值 // resolve 出去 sequence.then(v => { resolve(resData) }) }) } // 测试 reducePromise([p, p2, p3]).then((data) => { console.log(data)//[1,2,3] })