8.处理 Promise 抛出的异常
<script src="./Promise.js"></script> <script type="text/javascript"> let p = new Promise((resolve, reject) => { throw 'error'; }) p.then(res => { console.log(res) }, err => { }) console.log(p) </script>
function Promise(executor){ const self=this; function resolve(data){ self.PromiseStatus='resolved'; self.PromiseValue=data; } // 同样声明成为一个函数;修改状态 function reject(err){ self.PromiseStatus='rejected'; self.PromiseValue=err; } //给Promise添加一个属性pending; this.PromiseStatus ='pending' ; this.PromiseValue =null; executor(resolve,reject);//这个放在后面;它回去调用resolve和reject函数 } Promise.prototype.then=function(onResolve,onReject){ }
当我们抛出一个异常后,我们发现代码报错了;
因为你没有对异常进行任何的处理哈
那么如何对异常进行处理呢
可以使用try catch对抛出的异常进行处理哈
9 使用 try catch 对 Promise 异常进行处理
我们思考第一个问题;
如果我们要加上 try catch;
那么应该加在哪里呢???
function Promise(executor){ const self=this; function resolve(data){ self.PromiseStatus='resolved'; self.PromiseValue=data; } // 同样声明成为一个函数;修改状态 function reject(err){ self.PromiseStatus='rejected'; self.PromiseValue=err; } // 给Promise添加一个属性pending; this.PromiseStatus ='pending' ; this.PromiseValue =null; // new add对异常进行处理;使用try catch try{ executor(resolve,reject); }catch(err){ //这个会去接受throw 'error'抛出来的错误 // 并且去改变Promise的状态和修改他的值 reject(err); } } Promise.prototype.then=function(onResolve,onReject){ }
10 出现 Promise 对象状态修改了多次
<script src="./Promise.js"></script> <script type="text/javascript"> let p = new Promise((resolve, reject) => { resolve('ok') reject('err'); }) p.then(res => { console.log(res) }, err => { }) //我们发现Promise对象修改了多次;这是不可以的; console.log(p);//Promise {PromiseStatus: "rejected", PromiseValue: "err"} </script>
function Promise(executor){ const self=this; function resolve(data){ self.PromiseStatus='resolved'; self.PromiseValue=data; } // 同样声明成为一个函数;修改状态 function reject(err){ self.PromiseStatus='rejected'; self.PromiseValue=err; } // 给Promise添加一个属性pending; this.PromiseStatus ='pending' ; this.PromiseValue =null; // 对异常进行处理;使用try catch try{ executor(resolve,reject); }catch(err){ //这个会去接受throw 'error'抛出来的错误 // 并且去改变Promise的状态和修改他的值 reject(err); } } Promise.prototype.then=function(onResolve,onReject){ }
我们发现它先将状态改为成功;然后又将状态改为失败;
这样明显是要不得哈;
所以我们要处理 Promise对象状态只能够修改一次
我们应该在resolve和reject这两个函数中去判断状态是否发生改变
注意this的指向
11.解决 Promise 对象状态只能够修改一次
function Promise(executor){ const self=this; function resolve(data){ // 如果状态发生改变就直接返回(为了让Promise的状态只发生一次改变);注意this的指向 if( self.PromiseStatus!=='pending') return self.PromiseStatus='resolved'; self.PromiseValue=data; } // 同样声明成为一个函数;修改状态 function reject(err){ // 如果状态发生改变就直接返回(为了让Promise的状态只发生一次改变);注意this的指向 if( self.PromiseStatus!=='pending') return self.PromiseStatus='rejected'; self.PromiseValue=err; } this.PromiseStatus ='pending' ; this.PromiseValue =null; // 对异常进行处理;使用try catch try{ executor(resolve,reject); }catch(err){ reject(err); } } Promise.prototype.then=function(onResolve,onReject){ }