20 # 实现 promise 的 all 方法

简介: 20 # 实现 promise 的 all 方法

比如我们需要同时读取数据在返回

const fs = require("fs").promises;
fs.readFile("./file/name.txt", "utf-8").then((data) => {
    console.log("data--name-->", data);
});
fs.readFile("./file/age.txt", "utf-8").then((data) => {
    console.log("data--age-->", data);
});

下面实现一个 all 方法进行并发

const fs = require("fs").promises;
// 检查是否是 promise,不使用 instanceof 的原因是因为可能是别人实现的类
const isPromise = (value) => typeof value.then === "function";
Promise.all = function (promises) {
    return new Promise((resolve, reject) => {
        // 遍历数组 依次拿到执行结果,需要将索引跟数据对应起来
        let arr = [];
        let index = 0;
        const processData = (key, data) => {
            arr[key] = data;
            // 不能使用数组的长度来计算,写成 arr.length === promises.length 是有问题的,应该采用 index 自增的方式处理
            if (++index === promises.length) {
                resolve(arr);
            }
        };
        for (let i = 0; i < promises.length; i++) {
            let result = promises[i];
            if (isPromise(result)) {
                result.then((data) => {
                    processData(i, data);
                }, reject);
            } else {
                processData(i, result);
            }
        }
    });
};

all 有一个失败就会失败,由于是并发,promise 缺陷默认无法中断,只是不采用返回的结果

Promise.all([fs.readFile("./file/name.txt", "utf-8"), fs.readFile("./file/age.txt", "utf-8"), 666])
    .then((data) => {
        console.log("data--name--age-->", data);
    })
    .catch((err) => {
        console.log("err---->", err);
    });

有一个失败

目录
相关文章
|
前端开发
promise的resolve,reject,all方法
promise的resolve,reject,all方法
177 0
|
前端开发
前端学习案例12-promise&race&all之2
前端学习案例12-promise&race&all之2
49 0
前端学习案例12-promise&race&all之2
|
前端开发
前端学习案例11-promise&race&all之1
前端学习案例11-promise&race&all之1
41 0
前端学习案例11-promise&race&all之1
|
监控 前端开发
Promise的九大方法(resolve、reject、then、catch、finally、all、allSettled、race、any)你都用过那些?
Promise的九大方法(resolve、reject、then、catch、finally、all、allSettled、race、any)你都用过那些?
|
前端开发 API
听说你还不知道Promise的allSettled()和all()的区别?
从 ES2015 起, promises 的出现,让我们简化了异步操作。(所以 promise 越来越流行,掌握它的相关 API 变得至关重要)。
听说你还不知道Promise的allSettled()和all()的区别?
|
前端开发 JavaScript
javascript 中promise对象中的all,allSettled,any,race方法
javascript 中promise对象中的all,allSettled,any,race方法
|
19天前
|
前端开发 JavaScript
如何处理 JavaScript 中的异步操作和 Promise?
如何处理 JavaScript 中的异步操作和 Promise?
16 1
|
19天前
|
前端开发 JavaScript
在JavaScript中,什么是promise、怎么使用promise、怎么手写promise
在JavaScript中,什么是promise、怎么使用promise、怎么手写promise
31 4
|
19天前
|
前端开发 JavaScript 开发者
JavaScript 中的异步编程:Promise 和 Async/Await
在现代的 JavaScript 开发中,异步编程是至关重要的。本文将介绍 JavaScript 中的异步编程概念,重点讨论 Promise 和 Async/Await 这两种常见的处理异步操作的方法。通过本文的阐述,读者将能够更好地理解和应用这些技术,提高自己在 JavaScript 开发中处理异步任务的能力。
|
19天前
|
前端开发 JavaScript API
JavaScript学习笔记(一)promise与async
JavaScript学习笔记(一)promise与async