sailei1 / blog

1 stars 0 forks source link

你不知道的JS -promise 笔记 #81

Closed sailei1 closed 5 years ago

sailei1 commented 5 years ago

未来值 想当于一个时间占位符 它可能成功 也可能会失败

由于 Promise 封装了依赖于时间的状态——等待底层值的完成或拒绝,所以 Promise 本身是与时间无关的 一旦 Promise 决议,它就永远保持在这个状态。此时它就成为了不变值 Promise 一旦决议就不可再变

Promise 这种模式通过可信任的语义把回调作为参数传递,使得这种行为更可靠更合理。 通过把回调的控制反转反转回来,我们把控制权放在了一个可信任的系统(Promise)中, 这种系统的设计目的就是为了使异步编码更清晰。

调用 Promise 的 then(..) 会自动创建一个新的 Promise 从调用返回。 在完成或拒绝处理函数内部,如果返回一个值或抛出一个异常,新返回的(可链接的) Promise 就相应地决议。 如果完成或拒绝处理函数返回一个 Promise,它将会被展开,这样一来,不管它的决议 值是什么,都会成为当前 then(..) 返回的链接 Promise 的决议值。

var rejectedPr = new Promise( function(resolve,reject){ 
// 用一个被拒绝的promise完成这个promise
     resolve( Promise.reject( "Oops" ) );
} );

rejectedPr.then(
         function fulfilled(){  
           console.log('reslove') //不会到这里 
        },
         function rejected(err){
             console.log( err );  }
     )
  //结果输出  Oops

try..catch 只适用于 同步代码 不适用于异步代码

从Promise.all([ .. ])返回的主promise在且仅在所有的成员promise都完成后才会完 成。如果这些promise中有任何一个被拒绝的话,主Promise.all([ .. ])promise就会立 即被拒绝,并丢弃来自其他所有 promise 的全部结果。

Promise.race([ .. ])也接受单个数组参数。这个数组由一个或多个Promise、thenable或 立即值组成。立即值之间的竞争在实践中没有太大意义,因为显然列表中的第一个会获 胜,就像赛跑中有一个选手是从终点开始比赛一样!

与Promise.all([ .. ])类似,一旦有任何一个Promise决议为完成,Promise.race([ .. ]) 就会完成;一旦有任何一个 Promise 决议为拒绝,它就会拒绝。

Promise 局限性

顺序错误处理 返回 单一值 Promise 只能被决议一次(完成或拒绝) 惯性 用了promise 后面处理方式还是promise 直到完成或拒绝 无法取消的 Promise Promise 与不可信任的裸回调函数相比会更慢一些

Promise原理解析