用Promise实现传入的函数顺序执行的逻辑

文章详细介绍了如何使用Promise实现传入函数的顺序执行逻辑,通过示例展示了如何构建mergePromise函数,确保异步操作按顺序完成,并将结果存入数组。同时提到了Promise在面试中的常见问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

一、用Promise实现传入的函数顺序执行的逻辑

实现mergePromise函数,把传进去的数组按顺序先后执行,并且把返回的数据先后放到数组data中。

const timeout = ms => new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve();
    }, ms);
});

const ajax1 = () => timeout(2000).then(() => {
    console.log('1');
    return 1;
});

const ajax2 = () => timeout(1000).then(() => {
    console.log('2');
    return 2;
});

const ajax3 = () => timeout(2000).then(() => {
    console.log('3');
    return 3;
});

const mergePromise = ajaxArray => {
    // 在这里实现你的代码

};

mergePromise([ajax1, ajax2, ajax3]).then(data => {
    console.log('done');
    console.log(data); // data 为 [1, 2, 3]
});

// 要求分别输出
// 1
// 2
// 3
// done
// [1, 2, 3]

解析: 

因为对于异步函数来说,并不会按顺序执行完一个,再执行后一个。
这道题主要考察用Promise控制异步流程,让这些函数一个执行完,再执行下一个。

答案:

      const timeout = ms =>
        new Promise((resolve, reject) => {
          setTimeout(() => {
            resolve()
          }, ms)
        })

      const ajax1 = () =>
        timeout(2000).then(() => {
          console.log('1')
          return 1
        })

      const ajax2 = () =>
        timeout(1000).then(() => {
          console.log('2')
          return 2
        })

      const ajax3 = () =>
        timeout(2000).then(() => {
          console.log('3')
          return 3
        })

      const mergePromise = ajaxArray => {
        // 保存数组中的函数执行后的结果
        var arr = []
        // Promise.resolve方法调用时不带参数,直接返回一个resolved状态的 Promise 对象
        var resolved = Promise.resolve()
        ajaxArray.forEach(item => {
          resolved = resolved.then(item).then(res => {
            // 第一次的 then 方法用来执行数组中的每个函数,
            // 第二次的 then 方法接受数组中的函数执行后返回的结果,
            // 并把结果添加到 data 中,然后把 data 返回。
            arr.push(res)
            return arr
          })
        })
        // 遍历结束后,返回一个 Promise,也就是 resolved, 他的 [[PromiseValue]] 值就是 arr
        // 而 data(保存数组中的函数执行后的结果) 也会作为参数,传入下次调用的 then 方法中。
        return resolved
      }

      mergePromise([ajax1, ajax2, ajax3]).then(data => {
        console.log('done')
        console.log(data)
      })

      // 要求分别输出
      // 1
      // 2
      // 3
      // done
      // [1, 2, 3]

二、 Promise的常见面试题

Promise的常见面试题_小草莓蹦蹦跳的博客-优快云博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值