Promise最常见的利用就是解决异步申请。而之前的代码没有对于异步逻辑的解决,测试代码做一下批改
let promise = new MyPromise((resolve, reject) => { // resolve('---success----'); setTimeout(()=>{ resolve('success') },1000) // reject("---failed----");})promise.then(value => { console.log(value);}, reason => { console.log(reason)})
测试代码中退出了setTimeout
,依照应用Promise
的习惯,咱们心愿代码在期待1秒之后再执行resolve
then(successCallback, failedCallback) { // 状态判断 if (this.status === FULFILLED) { successCallback(this.value) } else if (this.status === REJECTED) { failedCallback(this.reason) } }
在MyPromise
类中,then
办法只判断了胜利和失败两种状态,当测试代码中呈现异步逻辑的时候,程序会持续向下进行执行then
办法。而在then
办法外面,此时的状态还是pending
。所以要退出第三种期待的状态判断。
这外面须要再定义两个状态的回调属性,初始值是undefined
,在then
办法中,将参数赋值给两个属性。并且在resolve
办法和reject
办法中,须要判断回调属性是否存在,存在就执行。
// 胜利回调 successCallback = undefined; // 失败回调 failedCallback = undefined;
resolve
和reject
办法更改:
resolve = value => { // 如果状态不是期待,阻止程序向下进行 if (this.status !== PENDING) return // 更改状态为胜利 this.status = FULFILLED // 保留胜利的值 this.value = value; // 判断胜利回调是否存在,如果存在就调用 this.successCallback && this.successCallback(this.value); } reject = reason => { // 如果状态不是期待,阻止程序向下进行 if (this.status !== PENDING) return // 更改状态为失败 this.status = REJECTED // 保留失败的起因 this.reason = reason; // 判断失败回调是否存在,存在就调用 this.failedCallback && this.failedCallback(this.reason); }
then
办法批改
then(successCallback, failedCallback) { // 状态判断 if (this.status === FULFILLED) { successCallback(this.value) } else if (this.status === REJECTED) { failedCallback(this.reason) } else { // 期待,须要将胜利回调和失败回调存储起来,期待须要执行的时候才执行 this.successCallback = successCallback; this.failedCallback = failedCallback; } }
测试代码测试通过,期待一秒后打印success