promise.all手写
时间: 2023-09-29 21:03:59 浏览: 106
在提供的代码中,已经实现了一个自定义的`promiseAll`函数来模拟`Promise.all`的功能。以下是对代码的解释和改进建议。
首先,在代码中定义了`isReadFile`函数,它返回一个`Promise`对象,用于读取文件。这是一个很好的实践,可以将其作为`Promise`的包装器来处理异步操作。
接着,在测试代码中创建了三个`Promise`对象`p1`,`p2`和`p3`,分别用于读取文件`1.txt`,`2.txt`和`3.txt`。然后将这些`Promise`对象作为参数传递给`promiseAll`函数。
需要注意的是,由于在读取文件`3.txt`时发生了错误,因此`p3`应该被拒绝,并返回一个错误消息。
接下来,可以通过以下方式改进代码:
1. 在错误处理中使用`reject`函数来传递实际的错误对象,而不仅仅是一个字符串错误消息。这样可以更好地捕获和处理错误。
2. 在`promiseAll`函数中,使用`Promise.resolve`来确保传递给`promiseAll`的参数是一个`Promise`对象数组。这样可以在实际参数是一个`Promise`对象时,不用手动包装成数组。
3. 在`promiseAll`函数中,使用`Promise.all`来处理传入的`promises`数组。这样可以更好地处理并发的异步操作,并且能够正确处理其中一个`Promise`对象失败的情况。
以下是改进后的代码示例:
```javascript
const fs = require('fs');
function isReadFile(file) {
return new Promise((resolve, reject) => {
fs.readFile(file, "utf8", (err, data) => {
if (err) {
return reject(err);
}
resolve(data);
});
});
}
function promiseAll(promises) {
return Promise.all(promises);
}
let p1 = isReadFile('1.txt');
let p2 = isReadFile('2.txt');
let p3 = isReadFile('3.txt');
promiseAll([p1, p2, p3]).then(
res => {
console.log(res);
},
err => {
console.log(err);
}
);
```
以上代码中,已经对错误处理进行了改进,并且使用了`Promise.resolve`和`Promise.all`来优化`promiseAll`函数的实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* *3* [手写promise.all](https://blog.csdn.net/weixin_54217534/article/details/125471928)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"]
[ .reference_list ]
阅读全文