如何控制Promise的串行执行?

简介: 如何控制Promise的串行执行?

Promise是如何执行的?

让我们来一起看看这个例子,下面的这个例子是一个数组,数组中的每一个元素都是一个函数,函数会返回一个Promise对象,但是每个Promise对象都被定时器控制着执行时间,熟系JS事件循环机制的同学都知道,Promise属于微任务,在执行的时候会加入到微任务队列中,所以执行顺序是2 -> 1 -> 3

const funcArr = [
    () =>
        new Promise((resolve) => {
            setTimeout(() => resolve(1), 2000);
        }),
    () =>
        new Promise((resolve) => {
            setTimeout(() => resolve(2), 1000);
        }),
    () =>
        new Promise((resolve) => {
            setTimeout(() => resolve(3), 3000);
        }),
];
for (let v of funcArr) {
    v().then(res => console.log(res))
}
复制代码

核心思想

实现Promise的核心思想是借助reduce,reduce这个API可以将不同的Promise串联起来。

实现步骤

第一步:定义一个接收不同Promise执行结果的数组

const res = []
复制代码

第二步:返回一个Promise对象

return new Promise((resolve,reject) => {     
})
复制代码

第三步:通过reduce将不同的Promise进行串联执行

arr.reduce((pre,cur) => {
    return pre.then(cur).then(data => res.push(data))
},Promise.resolve()).then(() => resolve(res))
复制代码

完整代码

const funcArr = [
    () =>
        new Promise((resolve) => {
            setTimeout(() => resolve(1), 2000);
        }),
    () =>
        new Promise((resolve) => {
            setTimeout(() => resolve(2), 1000);
        }),
    () =>
        new Promise((resolve) => {
            setTimeout(() => resolve(3), 3000);
        }),
];
/**
 * @description: 实现Promise的串行
 * @param {*}: 接收一个包含多个返回Promise对象的函数的数组
 * @return {*}: 返回一个Promise对象
 */
function inOrder(arr) {
    const res = []
    return new Promise((resolve,reject) => {
        arr.reduce((pre,cur) => {
            return pre.then(cur).then(data => res.push(data))
        },Promise.resolve()).then(() => resolve(res))       
    })
}
inOrder(funcArr).then(data => console.log(data))
复制代码

反思

  • reduce函数如果使用大括号的情况下,别忘了使用return.
  • then中包裹的是一个函数,这也就是为什么funcArr中每一个元素都是一个Promise对象。
  • resolve后其实还是一个Promise对象,只有这个Promise对象then之后才会变为其他类型的值。
  • reduce的第二个参数,在本次实例中其实是一个Promise对象,这一点指的我们借鉴。

参考资料

相关文章
|
4天前
|
存储 前端开发
PROMISE解决AJAX中的串行和并行
PROMISE解决AJAX中的串行和并行
31 0
|
9月前
|
存储 前端开发
Promise 解决AJAX中的串行并行
Promise 是个好东西!
85 0
|
4天前
|
前端开发 JavaScript
如何处理 JavaScript 中的异步操作和 Promise?
如何处理 JavaScript 中的异步操作和 Promise?
16 1
|
4天前
|
前端开发 JavaScript
在JavaScript中,什么是promise、怎么使用promise、怎么手写promise
在JavaScript中,什么是promise、怎么使用promise、怎么手写promise
26 4
|
4天前
|
前端开发 JavaScript 开发者
JavaScript 中的异步编程:Promise 和 Async/Await
在现代的 JavaScript 开发中,异步编程是至关重要的。本文将介绍 JavaScript 中的异步编程概念,重点讨论 Promise 和 Async/Await 这两种常见的处理异步操作的方法。通过本文的阐述,读者将能够更好地理解和应用这些技术,提高自己在 JavaScript 开发中处理异步任务的能力。
|
4天前
|
前端开发 JavaScript API
JavaScript学习笔记(一)promise与async
JavaScript学习笔记(一)promise与async
|
4天前
|
前端开发 JavaScript UED
JavaScript中的异步编程和Promise
【2月更文挑战第3天】在Web开发中,JavaScript是一门非常重要的编程语言,而异步编程是JavaScript中的一个关键概念。本文将介绍JavaScript中的异步编程特点,以及如何使用Promise来更加优雅地处理异步操作,帮助开发者更好地理解和应用这一技术。
19 3
|
4天前
|
前端开发 JavaScript 数据处理
JavaScript中的异步编程及Promise对象
【2月更文挑战第3天】 传统的JavaScript编程模式在处理异步任务时常常会导致回调地狱和代码可读性较差的问题,而Promise对象的引入为解决这一问题提供了一种优雅的解决方案。本文将介绍JavaScript中的异步编程方式以及Promise对象的使用方法和优势,帮助读者更好地理解和运用异步编程技术。
22 8
|
4天前
|
前端开发 JavaScript
JavaScript中的异步编程与Promise
【2月更文挑战第1天】在Web开发中,JavaScript是一种常用的编程语言,而异步编程是其重要特点之一。本文将介绍JavaScript中的异步编程机制,探讨Promise对象的使用以及如何通过Promise处理异步操作,帮助读者更好地理解和应用JavaScript异步编程技术。