实现promise的串行执行

297 阅读1分钟

有以下若干promise,实现方法使得promises串行执行返回结果。

const promise1 = () => new Promise((resolve, reject) => {

  setTimeout(() => {

    resolve(5)

  }, 2000)})

const promise2 = () => new Promise((resolve, reject) => {

  setTimeout(() => {

    resolve(1)

  }, 3000)

})const promise3 = () => new Promise((resolve, reject) => {

  setTimeout(() => {

    resolve(7)

  }, 1000)

})

var arr = [promise1, promise2, promise3];

  方法一   async/await执行 

       var fn = async function (arr) {

            for (let i = 0, len = arr.length; i < len; i++) {

                var result = await arr[i]()

                console.log(result)

            }

        }

        fn(arr)

方法二  then方法循环连接 

    const startTime = new Date().getTime();

    const promiseThen = function (arr) {

        let res = Promise.resolve()

        arr.forEach(item => {

            res = res.then(() => {

                return item()

            }).then((data) => {

                console.log(data)

            })

        });

        res.then(() => console.log(new Date().getTime() - startTime))

    }

    promiseThen(arr)

方法三 rxjs操作符实现

const { concatMap, reduce, catchError } = require("rxjs/operators");

const { of } = require('rxjs');

//...promise数组声明

const startTime = new Date().getTime();

of(...arr)

  .pipe(

    concatMap(test => test().catch(err => err)),

    reduce((acc, cur) => [...acc, cur], []))

  .subscribe(val => {

    console.log(val)

    console.log(new Date().getTime() - startTime)

  });