>[danger]编程:实现Promise.all 要手写实现`Promise.all`,我们需要以下步骤: 1. 创建一个新的`Promise`对象,并返回它。 2. 遍历传入的可迭代对象(通常是数组),对每个元素执行以下操作: - 如果元素不是`Promise`对象,则使用`Promise.resolve`将其转换为`Promise`对象。 - 对每个`Promise`对象,等待其状态变为`fulfilled`,并收集解决的值。 3. 如果所有`Promise`对象都成功解决,则使用`resolve`将所有收集到的解决值作为数组传递给新创建的`Promise`对象。 4. 如果任何一个`Promise`对象被拒绝,则使用`reject`将该拒绝原因传递给新创建的`Promise`对象。 下面是一个简单的示例代码,用于手动实现`Promise.all`: ```javascript function customPromiseAll(iterable) { return new Promise((resolve, reject) => { const promises = Array.from(iterable); const results = []; let completedCount = 0; if (promises.length === 0) { resolve(results); return; } promises.forEach((promise, index) => { Promise.resolve(promise) .then((result) => { results[index] = result; completedCount++; if (completedCount === promises.length) { resolve(results); } }) .catch((error) => { reject(error); }); }); }); } // 示例用法: const promise1 = Promise.resolve(1); const promise2 = Promise.resolve(2); const promise3 = Promise.resolve(3); customPromiseAll([promise1, promise2, promise3]) .then((results) => { console.log(results); // 输出 [1, 2, 3] }) .catch((error) => { console.error(error); }); ``` 在上述示例代码中,我们创建了一个新的`Promise`对象,并遍历传入的可迭代对象(这里假设是一个数组)。对于每个元素,我们使用`Promise.resolve`将其转换为`Promise`对象,并等待其解决。一旦所有`Promise`对象都解决成功,我们使用`resolve`将收集到的解决值作为数组传递给新创建的`Promise`对象。如果任何一个`Promise`对象被拒绝,我们将拒绝原因传递给新创建的`Promise`对象。