手写promise.catch
时间: 2024-09-02 21:01:08 浏览: 124
手写Promise的`.catch`方法通常用于处理Promise链中的错误情况。在JavaScript中,当你有一个返回Promise的对象,你可以添加`.catch`方法来捕获并处理这个Promise在执行过程中可能出现的错误。当原Promise拒绝(即抛出异常),`.catch`会接收到那个错误,并允许你在回调函数中处理它,使得程序不会因为未被捕获的错误而中断。
以下是一个简单的例子:
```javascript
function myFunction() {
return new Promise((resolve, reject) => {
// 模拟可能会失败的操作
if (Math.random() > 0.5) {
reject(new Error('Something went wrong'));
} else {
resolve('Success!');
}
});
}
myFunction()
.then(result => console.log(result)) // 成功时的处理
.catch(error => console.error('Error caught:', error)); // 错误时的处理
```
在这个例子中,如果`myFunction`内部操作失败,`reject`会被调用,然后`.catch`会捕获到这个错误并打印出来。
相关问题
手写Promise.all
Promise.all() 方法接收一个 Promise 对象的数组作为参数,返回一个新的 Promise 对象。当数组中所有的 Promise 对象都成功时,新 Promise 对象才会成功;只要任何一个 Promise 对象失败,新 Promise 对象就会失败。
以下是一个手写的 Promise.all() 方法的实现:
```javascript
function promiseAll(promises) {
return new Promise((resolve, reject) => {
let results = new Array(promises.length);
let resolvedCount = 0;
promises.forEach((promise, index) => {
promise.then(result => {
results[index] = result;
resolvedCount++;
if (resolvedCount === promises.length) {
resolve(results);
}
}).catch(error => {
reject(error);
});
});
});
}
```
这个实现中,我们首先创建了一个新的 Promise 对象,并在该 Promise 对象中使用一个数组来存储每个 Promise 对象的结果。我们还定义了一个计数器 resolvedCount,用于跟踪已经解决的 Promise 对象的数量。
然后,我们使用 forEach() 方法遍历传递给 promiseAll() 方法的 Promise 对象数组,并为每个 Promise 对象设置一个 then() 方法来处理成功的情况。在每个成功的 then() 回调函数中,我们将该 Promise 对象的结果存储在结果数组中,并将 resolvedCount 计数器增加 1。如果 resolvedCount 的值等于 Promise 对象的数组的长度,则意味着所有 Promise 对象都已成功解决,我们就可以使用 resolve() 方法来解决新的 Promise 对象,并传递结果数组作为参数。
如果任何一个 Promise 对象失败,则我们使用 catch() 方法处理错误情况,并使用 reject() 方法拒绝新的 Promise 对象。
手写promise.all
在给定的代码中,实现了一个自定义的promiseAll函数,用于同时处理多个Promise对象。它接受一个Promise对象数组作为参数,并返回一个新的Promise对象,该Promise对象将在所有传入的Promise对象都成功解析后才会被解析,否则将被拒绝。
这个自定义的promiseAll函数的实现通过使用Promise构造函数和Promise.prototype.then方法来实现。它使用了一个计数器来跟踪每个Promise对象的解析状态,并使用一个数组来存储每个Promise对象的解析结果。当所有的Promise对象都成功解析时,它将返回一个包含所有解析结果的数组;当其中任何一个Promise对象被拒绝时,它将返回拒绝的原因。
请注意,以上给出的自定义promiseAll函数的实现是正确的,它通过正确地使用Promise构造函数和Promise.prototype.then方法来实现对多个Promise对象的并行处理。然而在给定的代码中,对于Promise对象的拒绝处理并未进行充分的考虑。在删除了3.txt文件后,Promise对象p3应该被拒绝,但该代码并未正确处理这种情况。因此,需要对代码进行修改以正确处理这种情况。
以下是一个修正后的示例代码,其中包含了对Promise对象的拒绝进行正确处理的修改:
```javascript
function promiseAll(promises) {
return new Promise((resolve, reject) => {
let count = 0;
let results = [];
if (promises.length === 0) {
resolve(results);
} else {
promises.forEach((promise, index) => {
promise.then(result => {
results[index = result;
count++;
if (count === promises.length) {
resolve(results);
}
}).catch(error => {
reject(error);
});
});
}
});
}
let p1 = isReadFile('1.txt');
let p2 = isReadFile('2.txt');
let p3 = isReadFile('3.txt');
promiseAll([p1, p2, p3]).then(res => {
console.log(res);
}).catch(err => {
console.log(err);
});
```
这样修改后的代码将正确处理每个Promise对象的解析结果,无论是成功还是失败。在删除了3.txt文件后,Promise对象p3将被拒绝,并且正确的调用了promiseAll的失败回调函数。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
阅读全文
相关推荐













