自定义Promise.catch()
时间: 2024-01-19 18:04:26 浏览: 84
要自定义Promise的catch()方法,可以通过在Promise原型上定义一个新的catch()方法来实现。下面是一个示例:
```javascript
// 定义一个自定义的catch()方法
Promise.prototype.customCatch = function (onRejected) {
return this.then(undefined, onRejected);
};
// 使用自定义的catch()方法
const promise = new Promise((resolve, reject) => {
reject("Error occurred");
});
promise.customCatch((error) => {
console.log("Custom catch:", error);
});
```
在上面的示例中,我们通过在Promise原型上定义了一个customCatch()方法来自定义catch()方法。这个自定义的catch()方法在被调用时会返回一个新的Promise,将错误处理函数传递给then()方法的第二个参数。这样,我们就可以使用customCatch()方法来捕获Promise的错误。
注意:自定义catch()方法只是一种实现方式,实际上,Promise已经内置了catch()方法,可以直接使用它来捕获错误。上述示例仅用于演示如何自定义catch()方法。
相关问题
手写promise,promise.all()
手写Promise通常是为了深入理解其工作原理以及在某些特定场景下进行自定义控制。Promise是一个表示异步操作最终完成(成功或失败)的对象。它有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。手写Promise的基本结构如下:
```javascript
function customPromise(executor) {
const promise = {
state: 'pending',
value: null,
reason: null,
then(onFulfilled, onRejected),
catch(onRejected)
};
function resolve(value) {
if (promise.state !== 'pending') return;
promise.state = 'fulfilled';
promise.value = value;
// 如果有onFulfilled函数,调用并更新状态
if (typeof onFulfilled === 'function') onFulfilled(promise.value);
}
function reject(reason) {
if (promise.state !== 'pending') return;
promise.state = 'rejected';
promise.reason = reason;
// 如果有onRejected函数,调用并更新状态
if (typeof onRejected === 'function') onRejected(promise.reason);
}
executor(resolve, reject);
return promise;
}
// 使用示例
customPromise((resolve, reject) => {
setTimeout(() => resolve('Hello'), 1000);
}).then(val => console.log(val)); // 输出 'Hello' after 1 second
```
`Promise.all()`则是Promise的一个静态方法,接收一个Promise数组作为参数,返回一个新的Promise,当所有传入的Promise都解析完毕后,结果会是一个包含每个Promise结果的数组。如果任一Promise被拒绝,返回的结果就会变为那个拒绝的Promise。
```javascript
function all(promises) {
return new Promise((resolve, reject) => {
let counter = promises.length;
const results = [];
if (!counter) {
resolve(results);
return;
}
promises.forEach((promise, index) => {
promise.then(result => {
results[index] = result;
counter--;
if (!counter) resolve(results);
}).catch(err => {
reject(err);
if (!counter) reject(err); // 如果所有Promise都拒绝,则立即结束
});
});
});
}
const promises = [customPromise(...), customPromise(...)];
all(promises).then(values => console.log(values));
```
手写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>
阅读全文
相关推荐















