Promise对象

Promise对象

在这里插入图片描述


promise是什么?
es6 Promise官方地址
概念:
Promise 其实是异步编程的一种解决方案.简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,可以从改对象获取异步操作的消息。可以用来解决回调地狱的问题。

  1. promise是一门新的新的技术,是JS中进行异步编程的新解决方案(旧方案就是单纯的使用回调函数解决)
    • 异步编程(包括但不只有这些):
      //传统用的是回调函数
      • fs文件操作
      require('fs').addFile('./index.html',(err,data)=>{})
      
      • 数据库操作
      • AJAX
      $.get('/sever',(data)=>{})
      
      • 定时器
      setTimeout(()=>{},2000)
      
  2. 从语法上,Promise是一个构造函数,Promise对象用来封装一个异步操作并可以获取其 成功 / 失败 的结果值
1.Promise有几种状态?

3种,等待(pending)、已完成(fulfilled)、已拒绝(rejected)
Promise 对象只有: 从 pending 变为 fulfilled 和从 pending 变为 rejected 的状态改变。只要处于 fulfilled 和 rejected ,状态就不会再变了即 resolved(已定型)。

const Promise1=new Promise((resolve,reject)=>{}); //pending
const Promise2=new Promise((resolve,reject)=>resolve(1)); //resolved
const Promise3=new Promise((resolve,reject)=>reject(2)); //rejected
console.log(Promise1,'Promise1')//pending
console.log(Promise2,'Promise2')//resolved
console.log(Promise3,'Promise3')//rejected


Promise2.then(v=>{
  console.log('then')
  console.log(v,'v')//1 v
})

Promise3.then(v=>{
  console.log('then')
  console.log(v,'v')
}).catch(v=>{
  console.log('catch')
  console.log(v,'v')//2 v
})
2.Promise的状态是否可变?

不可变,一个promise的状态只可能从“等待”转到“完成”态或者“拒绝”态,不能逆向转换,同时“完成”态和“拒绝”态不能相互转换

3.Promise如何解决回调地狱?

then里面可以return Promise,来防止地狱回调

function request1(){
  return new Promise(resolve=>resolve(1))
}
function request2(){
  return new Promise(resolve=>resolve(2))
}
function request3(){
  return new Promise(resolve=>resolve(3))
}

requese1().then(v=>{
  console.log('第一层then')
  console.log(v,'v')//1 v
  return request2();
}).then(v=>{
 console.log('第二层then')
 console.log(v,'v')//2 v
 return request3();
).then(v=>{
 console.log('第三层then')
 console.log(v,'v')//3 v
)
4.Promise有哪些方法?他们的应用场景是什么?(all / race)
  1. Promise.all( ).then( )适用于处理多个异步任务,且所有的异步任务都得到结果时的情况。
  2. Promise.race()赛跑机制,只认第一名
const Promise1=new Promise(resolve=>{
  setTimeout(()=>{
  	resolve(1)
  },3000)
})
const Promise2=new Promise(resolve=>{
  setTimeout(()=>{
  	resolve(2)
  },2000)
})
const Promise3=new Promise(resolve=>{
  setTimeout(()=>{
  	resolve(3)
  },1000)
})
//Promise.all根据传入的顺序进行输出
Promise.all([Promise1,Promise2,Promise3]).then(v=>{
  console.log('then');
  console.log(v,'v');//[1,2,3]
}).catch(v=>{
  console.log('catch');
  console.log(v,'v')
})
//谁先返回就用谁,不管是resole还是reject
Promise.once([Promise1,Promise2,Promise3]).then(v=>{
  console.log('then');
  console.log(v,'v');//3
}).catch(v=>{
  console.log('catch');
  console.log(v,'v')
})
5.如何让Promise顺序执行(async / await)

es6-async 函数官方详解

  1. async函数返回一个 Promise 对象,可以使用then方法添加回调函数。当函数执行的时候,一旦遇到await就会先返回,等到异步操作完成,再接着执行函数体内后面的语句。
  2. async函数返回的 Promise 对象,必须等到内部所有await命令后面的 Promise 对象执行完,才会发生状态改变,除非遇到return语句或者抛出错误。也就是说,只有async函数内部的异步操作执行完,才会执行then方法指定的回调函数。
const Promise1=new Promise(resolve=>{
  setTimeout(()=>{
  	resolve(1)
  },3000)
})
const Promise2=new Promise(resolve=>{
  setTimeout(()=>{
  	resolve(2)
  },2000)
})
const Promise3=new Promise(resolve=>{
  setTimeout(()=>{
  	resolve(3)
  },1000)
})
//async/await
async function execute(){
  await Promise1.then(v=>console.log(v))//1
  await Promise2.then(v=>console.log(v))//2
  await Promise3.then(v=>console.log(v))//3
}
execute();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端初见

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值