zoukankan      html  css  js  c++  java
  • [清代八股文]Promise如何实现串行执行

    要求

    写一个函数,接收一个数组,数组里面的子元素均为执行后能返回Promise对象的函数,要求这些函数按顺序依次执行,最终输出顺序执行的结果。

    // 6s后输出[1,2,3]
    const funcArr = [
      () =>
        new Promise((resolve) => {
          setTimeout(() => resolve(1), 2000);
        }),
      () =>
        new Promise((resolve) => {
          setTimeout(() => resolve(2), 1000);
        }),
      () =>
        new Promise((resolve) => {
          setTimeout(() => resolve(3), 3000);
        }),
    ];
    

    思路

    由于前一个函数执行的结果需要影响到后一个函数的执行,考虑用reduce函数来实现这种顺序关联关系。能想到reduce这个解法,这个问题实际上就迎刃而解了。

    // 函数最终返回一个promise
    function runPromiseByQueue(promiseFuncArr) {
      const res = [];
      return new Promise((resolve, reject) => {
        promiseFuncArr
          .reduce(
            (acc, cur) => acc.then(cur).then((data) => res.push(data)),
            Promise.resolve()
          )
          // reduce函数最终返回一个promise,在onResolved这一步骤执行resolve,将结果输出
          .then(() => resolve(res));
      });
    }
    

    最终效果如下:

    runPromiseByQueue(funcArr).then(data => console.log(data)) // 6s后输出[1,2,3]
    

    总结

    当然,这个做法只是满足了文中开头所要求的效果,核心功能已经实现。对于一些健壮性的处理并没有做(比如输入参数类型的判断,对于执行时可能出现的reject情况处理),核心是利用reduce函数既能遍历数组,又能在前后元素之间建立联系的特点。

  • 相关阅读:
    Scrapy
    关于函数名称和库函数名称冲突的故事
    Hibernate的一级缓存
    spring-mvc 与 openid4java
    openid4java 使用记录[转载]
    Linux定时任务Crontab详解_定时备份
    Spring的线程池ThreadPoolTaskExecutor使用案例
    BZOJ4275 : [ONTAK2015]Badania naukowe
    BZOJ4137 : [FJOI2015]火星商店问题
    BZOJ2832 : 宅男小C
  • 原文地址:https://www.cnblogs.com/zhangnan35/p/14584035.html
Copyright © 2011-2022 走看看