专业的编程技术博客社区

网站首页 > 博客文章 正文

前端面试-手写promise.all的功能

baijin 2025-08-05 17:26:24 博客文章 2 ℃ 0 评论

手写一个类似于 JavaScript 中 Promise.all 功能的函数实现。Promise.all 的核心作用是处理多个 Promise 对象:当所有 Promise 都成功解决(resolved)时,返回一个包含所有结果的数组;如果有任何一个 Promise 被拒绝(rejected),则立即拒绝并返回拒绝原因。

下面是一个简洁的 JavaScript 代码示例,实现了一个自定义的 myPromiseAll 函数。代码中使用了基本的 Promise 机制,并考虑了边界情况(如空输入):

function myPromiseAll(promises) {
  return new Promise((resolve, reject) => {
    // 如果输入为空或不是可迭代对象,直接解决为一个空数组
    if (!Array.isArray(promises) || promises.length === 0) {
      resolve([]);
      return;
    }

    const results = new Array(promises.length); // 存储每个 Promise 的结果
    let completedCount = 0; // 计数器,跟踪已完成的 Promise 数量

    promises.forEach((promise, index) => {
      // 确保每个元素都被包装为 Promise(处理非 Promise 值)
      Promise.resolve(promise)
        .then(value => {
          results[index] = value; // 存储成功结果
          completedCount++;
          // 当所有 Promise 都完成时,解决返回的 Promise
          if (completedCount === promises.length) {
            resolve(results);
          }
        })
        .catch(error => {
          reject(error); // 有任何拒绝,立即拒绝返回的 Promise
        });
    });
  });
}
const p1 = Promise.resolve(1);
const p2 = new Promise((resolve) => setTimeout(() => resolve(2), 100));
const p3 = Promise.reject("Error occurred");

// 测试所有成功
myPromiseAll([p1, p2]).then(results => console.log(results)); // 输出: [1, 2]

// 测试有失败
myPromiseAll([p1, p3]).catch(error => console.error(error)); // 输出: "Error occurred"

这个实现的关键点:

  • 高效处理异步:使用计数器确保只在所有 Promise 完成时解决。
  • 错误处理:任何一个 Promise 拒绝时,立即拒绝返回的 Promise。
  • 兼容性:通过 Promise.resolve 包装输入,处理非 Promise 值(如数字或字符串)。


Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表