promise用来解决回调地狱的问题,把异步的代码用同步的方式来实现
Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。
它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。
一个Promise的三种状态
pending: 初始状态,既不是成功,也不是失败状态。
fulfilled: 意味着操作成功完成。
rejected: 意味着操作失败。
Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。它们是两个函数,由 JavaScript 引擎提供,不用自己部署。
Resolve函数的作用是,将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;
Reject函数的作用是,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
Promise实例生成以后,可以用then方法分别指定resolved状态和rejected状态的回调函数。
demo1==============================================
let flag = true;
function task() {
return new Promise(function (resolve, reject) {
//同步代码,立即执行
console.log('执行promise回调中的代码');
if (flag) {
// 只有调用resolve时,才会执行then中的回调
// resovle触发的then中的回调是异步操作
resolve('success')
} else {
// 只有调用reject时,才会执行catch中的回调
// reject触发的catch中的回调是异步操作
reject('error')
}
})
}
task()
.then(function(msg){
console.log(msg);
})
.catch(function(err){
console.log(err);
})
promise.all([ajax1(),ajax2()])当ajsx1和ajax2都返回数据时触发
.then()当ajsx1和ajax2都成功时调用的函数
.catch()当ajsx1和ajax2任一函数失败时调用的函数
promise.race([ajax1(),ajax2()])看谁先执行完函数时触发
.then()当ajsx1和ajax2谁先执行完且成功是调用
.catch()失败时调用
asyne和await是promise的语法糖
asyne定义了一个异步函数,消除了promise中then的链式调用
await 后面的同步代码
asyne function reader(){
try{ 处理异常 如果此时有错误会被捕获
let result=await ajax()
task(result)
}.catch(err){
console.log('异常时运行的代码')
}
}
网友评论