比如我们需要同时读取数据在返回
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); });
有一个失败