总结Primise对象的用法

总结Primise对象的用法Primise 对象 作用 Promise 是异步解决的一种方案 可以将异步操作以同步的流程表达出来 避免层层嵌套的回调函数 特点 对象状态不受外界影响 Promise 对象代表一个异步操作 存在 3 中状态 pending 进行中 fulilled 已成功

大家好,我是讯享网,很高兴认识大家。

Primise对象

作用

Promise是异步解决的一种方案,可以将异步操作以同步的流程表达出来,避免层层嵌套的回调函数。

特点

  1. 对象状态不受外界影响。Promise对象代表一个异步操作,存在3中状态:pending(进行中),fulilled(已成功),rejected(以失败),只有异步操作的结果可以决定是哪一种状态,任何其他操作都无法改变这个状态。
  2. 一旦状态改变 ,任何时候都可以得到结果。即状态从pending->fulfilled 或者从pending->rejected,promise状态就会凝固,不会再产生变化,将一直保持变化的结果。就算改变已经发生,再对promise对象添加回调函数,也会得到这个结果。
  3. 新建Promise对象后就会立即执行,无法途中取消
 const promise = new Promise(resolve => { 
    resolve() }) promise .then(resole => console.log('resolve')) setTimeout(() => { 
    promise.then(()=>console.log('added ')) },3000) // output : resolve  // added 

讯享网

基本用法

讯享网const promise = new Promise((resolve,reject) => { 
    // some code if(/*异步操作成功*/){ 
    resolve() }else{ 
    reject() } }) promise.then(() => { 
   /*success*/} , () => { 
   /*failure*/} ) // 等价于 promise .then(() => { 
   /*success*/}) .catch(() => { 
   /*failure*/}) 

执行顺序

Promise对象创建后立即执行,then方法指定的回调函数会在当前脚本所有同步任务执行完成后才会执行

let promise = new Promise((resolve,reject) => { 
    console.log('Promise') resolve() }) promise.then(() => { 
    console.log('resolved') ) console.log('当前脚本最后一个同步任务') // output: Promise  // 当前脚本最后一个同步任务  // resolved 

resolve,reject回调参数

resolve,reject回调函数改变promise实例对象状态的同时可以通过 resolve(‘参数’) reject(‘参数’) ,将参数传递给下一步的操作,reject函数通常是Error对象实例,resolve函数参数除了正常的值外还可以是一个promise实例,如果是promise对象,原来的状态将会无效,promise实例将会等待传入的promise实例的状态判断进行下一步操作。


讯享网

讯享网const p1 = new Promise((resolve,reject) => { 
    setTimeout(() => reject(new Error('fail')'),3000) }) const p2 = new Promise((resolve,reject) => { 
    setTimeout(() => resolve(p1)'),1000) }) p2 .then(() => console.log('resolve')) .catch(err => console.log(err)) // output:Error:fail 

方法

  • Promise.prototype.then() ;
    作用:他的作用是为promise实例添加状态改变是的回调函数。
    特点:then方法返回的是一个新的Promise实例(注意不是原来那个Promise实例),因此可以采用链式写法,即.then(…).then(…).
  • Promise.prototype.catch()
    作用:该方法是.then(null , rejection)的别名。用于指定发生错误时的回调函数。
    特点:要注意的是,Prmise对象的错误具有冒泡性质,会一直向后传递,知道被捕获为止,也就是说错误总是会被下一个catch语句捕获。
  • Promise.prototype.finally()
    作用:finally方法用于指定不管promise对象最后状态如何都会被执行的操作
 const promise = new Promise((resolve , reject) => { 
    if(parseInt(Math.random()*10) > 5){ 
    resolve() }else{ 
    reject() } }) promise .then(() => console.log('resolved')) .catch(() => console.log('rejected')) .finally(() => console.log('finally')) 
  • Promise.all( )
    作用:该方法用于将多个Promise实例包装成一个新的Promise实例。
    特点:
    1、返回的Promise实例的状态,由组成他的多个Promise实例决定,只有数组内内的全部Promise实例对象的状态变成fulfilled,最终返回的Promise实例的状态才会变成fulfilled。此时,数组内的所有Promise实例的返回值组成一个数组,传递给最终的Promise实例
    2、只要数组内存在一个Promise对象的实例为reject状态,则最终返回的Promise实例的状态才会变成rejected。此时第一个被rejected的实例的返回值会传递给最终的Promisesd实例
    3、如果数组内不全是Promise实例,就会先调用Promise.resolve方法,将参数转化为Promise实例
    4、该方法的参数不一定要是数组,但必须具有Iterator接口,并且返回的每个成员都是Promise实例
讯享网 const promises = [0,1,2].map( id => { 
    return new Promise((resolve , reject) => { 
    if(parseInt(Math.random()*10) > 3){ 
    console.log('arr [' + id +']状态为resolve') resolve(id) }else{ 
    console.log('arr [' + id +']状态为rejected') reject(id) } }) }) Promise.all(promises) .then( arr => console.log(arr)) .catch( id => console.log(id)) 
  • Promise.race( )
    作用:同Promise.all一样是将多个Promise实例包装成一个新的Promise实例
    特点:其中一个Promise实例率先改变状态,最终的Promise实例状态也会跟着改变。那个最先改变的Promise实例的返回值也会传递给最终的Promise实例
// 如果五秒之内fetch请求无法获得结果,变量p的状态将变为rejecteed,从而触发catch内的回调函数 const p = Promise.race([ fetch('/resource-that-may-take-a-while'), new Promise((resolve , reject) => { 
    setTimeout(()=>reject(new Error('request timeout')),5000) }) ]) p.then(response => console.log(response)) p.catch(err => console.log(error)) 
  • Promise.resolve()
    作用:将现有对象转化为Promise对象
    参数:输入的参数有四种情况
    1、参数是一个Promise实例
    2、参数是一个thenable对象(即对象中含有then方法的对象),Promise.resolve方法会将这个对象转化为Promise对象,然后立即执行thenable内的then方法
讯享网let thenable = { 
    then:(resolve,reject){ 
    resolve(42) } } let p1 = Promise.resolve(thenable); p1.then((value) => { 
    console.log(value) //42 }) /* thenable对象的then方法执行后,对象p1的状态转化为resolved,从而立即执行最后的then方法指定的回调函数,输出42 */ 

3、参数不是一个thenable或者根本不是对象(例如传递一个字符串)

 const p = Promise.resolve('hello'); p.then( str => console.log(str)) //output: hello  

返回的Promise实例的状态从生成起就是resolved,所以回调函数会立即执行
4、不带任何参数
不带参数将直接返回一个状态为resolved状态的Promise对象,方便调用

讯享网 const p = Promise.resolve() p.then(() => { 
   }) 
  • Promise.reject()
    作用:直接返回一个状态为rejected的Promise实例
 const p = Promise.reject('出错了!') //等价于 const p = new Promise(reject => reject('出错了!')) p.catch(reson => console.log(reson)) 

特别的,Promise.reject()的参数会原封不动地作为reject的理由变成后续方法的参数。这与Promise.resolve()不一致

讯享网let thenable = { 
    then:(resolve,reject){ 
    reject('出错了’) } } let p1 = Promise.reject(thenable); p1.catch((reson) => { 
    console.log(reson === thenable) // true }) 
  • 拓展方法 done()
  • Promise.try()
小讯
上一篇 2025-03-13 09:47
下一篇 2025-03-17 17:18

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/74608.html