promise是什么? 1、主要用于异步计算 2、可以将异步操作队列化,按照期望的顺序执行,返回符合预期的结果 3、可以在对象之间传递和操作promise,帮助我们处理队列 Promise`对象代表一个异步操作,三种状态 pendding : 挂起(等待) 处于未决阶段,表示当前事情还处于挂起状态最终结果没有出现
resolved : 已处理 处于已决阶段,表现是事情已经出现了结果,这个结果是一个成功的结果,可以按照当前结果的正常逻辑顺序继续下去的结果
rejected : 已拒绝 处于已决阶段,表现是事情已经出现了结果,这个结果是一个未成功的结果,当前结果的并不能按照正常逻辑顺序继续下去的结果
注:一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为 resolved(已定型)。如果改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。
如何创建的
let p = new Promise(function(resolve, reject){ resolve('要返回的数据可以任何数据例如接口返回数据'); // reject('要返回的数据可以任何数据例如接口返回数据'); }); p.then((data)=>{ //执行代码逻辑 console.log(data)//成功 }; ) p.catch(err=>{ console.log("有一个先失败的情况",err)//失败 })成功的用then返回,失败的用catch返回 采用链式的then,可以指定一组按照次序调用的回调函数。这个时候前面的一个返回的可能是另外一个Promise对象(也就是说有异步操作)。这样后面的这个Promise就依赖于前面Promise对象的状态。 finally() ES2018出来的,没有参数,当promise为已决时运行该函数 1.用来测试promise是否已到已决状态 2.对于异步操作完成后不论结果如何的后续操作
function fun(){ return new Promise((resovle,reject)=>{ setTimeout(()=>{ if(Math.random()<0.3){ resovle(true); }else{ // throw("11111111"); reject(); } },500) }) } let pro=fun(); pro.finally(()=>{ console.log("11"); })reject返回的(会报错) reject返回的(不报错) 构造函数成员(静态成员)就是能简写 resolve()
const pro = Promise.resolve(1);等同于
const pro = new Promise((resolve,reject)=>{ resolve(1) })reject()
const pro= Promise.reject(2)等同于
const pro = new Promise((resolve,reject)=>{ reject(2) })注:如果传递的是一个promise,则直接返回传递的promise对象
Promise.all()
Promise 的 all 方法提供了并行执行异步操作的能力,并且在所有异步操作执行完后才执行回调。
function cutUp(){ console.log('挑作业本'); var p = new Promise(function(resolve, reject){ //做一些异步操作 setTimeout(function(){ console.log('挑好购买作业本'); resolve('新的作业本'); }, 1000); }); return p; } //买笔 function boil(){ console.log('挑笔芯'); var p = new Promise(function(resolve, reject){ //做一些异步操作 setTimeout(function(){ console.log('挑好购买笔芯'); resolve('新的笔芯'); }, 1000); }); return p; } Promise.all([cutUp(),boil()]).then(function(results){ console.log("写作业的工具都买好了"); console.log(results); });async
async 用于去修饰函数(函数声明和函数表达式),放在函数的开始位置,被修饰的函数一定返回一个promise对象
async function test(){ return 123; // throw 456; } const pro = test(); console.log(pro)如果有错误
// 如果async中有错误的时候 async function getPromise(){ if(Math.random() < 0.5){ return 1; }else { throw 2; } } async function test(){ getPromise().then(data =>{ const result = data; console.log("正常",result) },err => { console.log("错误",err); }) } test()await 等待
相当于then方法,await必须写在async函数里面
async function test1(){ return 123; } async function test2(){ const result = await test1(); console.log(result) } test2()