前言
Promise 是前端面试和工作中极其常见的一个概念,对于它各种办法的手写实现也很有市场,明天在这里总结一下 Promise 根本办法的简略实现。
catch() 办法
catch
办法是对 then
办法的封装,只用于接管 reject(reason)
中的错误信息。
因为在 then
办法中 onRejected
参数是可不传的,不传的状况下,错误信息会顺次往后传递,直到有 onRejected
函数接管为止,因而在写 promise
链式调用的时候,then
办法不传 onRejected
函数,只须要在最开端加一个 catch()
就能够了,这样在该链条中的 promise
产生的谬误都会被最初的 catch
捕捉到。
catch(onRejected) {return this.then(null, onRejected);
}
done() 办法
catch
在 promise
链式调用的开端调用,用于捕捉链条中的错误信息,然而 catch
办法外部也可能呈现谬误,所以有些 promise
实现中减少了一个办法 done
。
done
相当于提供了一个不会出错的 catch
办法,并且不再返回一个 promise
,个别用来完结一个 promise
链。
done() {
this.catch(reason => {console.log('done', reason);
throw reason;
});
}
finally() 办法
finally
办法用于无论是 resolve
还是 reject
,finall
y 的参数函数都会被执行。
finally(fn) {
return this.then(value => {fn();
return value;
}, reason => {fn();
throw reason;
});
};
Promise.all() 办法
Promise.all
办法接管一个 promise
数组,返回一个新 promise2
,并发执行数组中的全副 promise
,所有 promise
状态都为 resolved
时,promise2
状态为 resolved
并返回全副 promise
后果,后果程序和 promise
数组程序统一。如果有一个 promise
为 rejected
状态,则整个 promise2
进入 rejected
状态。
static all(promiseList) {return new Promise((resolve, reject) => {const result = [];
let i = 0;
for (const p of promiseList) {
p.then(value => {result[i] = value;
if (result.length === promiseList.length) {resolve(result);
}
}, reject);
i++;
}
});
}
Promise.race() 办法
Promise.race
办法接管一个 promise
数组, 返回一个新 promise2
,程序执行数组中的 promise
,有一个 promise
状态确定,promise2
状态即确定,并且同这个 promise
的状态统一。
static race(promiseList) {return new Promise((resolve, reject) => {for (const p of promiseList) {p.then((value) => {resolve(value);
}, reject);
}
});
}
Promise.resolve() 和 Promise.reject()
Promise.resolve
用来生成一个 rejected
实现态的 promise
,Promise.reject
用来生成一个 rejected
失败态的 promise
。
static resolve(value) {
let promise;
promise = new Promise((resolve, reject) => {this.resolvePromise(promise, value, resolve, reject);
});
return promise;
}
static reject(reason) {return new Promise((resolve, reject) => {reject(reason);
});
}
总结
罕用的办法根本就这些,Promise
还有很多扩大办法,这里就不一一展现,基本上都是对 then
办法的进一步封装,只有你的 then
办法没有问题,其余办法就都能够依赖 then
办法实现。
~
~ 本文完,感激浏览!
~
学习乏味的常识,结识乏味的敌人,塑造乏味的灵魂!
大家好,我是〖编程三昧〗的作者 隐逸王 ,我的公众号是『编程三昧』,欢送关注,心愿大家多多指教!