ES6-day05
ES5异步编程的解决方案
$.ajax({
url,
method,
data,
success(res) {
console.log(res)
$.ajax({
url,
method,
data: res.data[0].id,
success() {
}
})
}
})
1.Promise
Promise 是异步编程的一种解决方案,比传统的解决方案(回调函数和事件)更合理和更强大。
它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。
所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。
Promise对象,可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。
Promise对象提供统一的接口,使得控制异步操作更加容易。
1)创建Promise实例
// 实例化
Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject,它们是两个函数
Promise对象代表一个异步操作有三种状态: pending(进行中)、fulfilled(已成功)和rejected(已失败)。
状态发生改变之后就凝固了,不会再变了,会一直保持这个结果,这时就称为 resolved(已定型)
let promise = new Promise((resolve, reject) => {
if(1 > 0) {
// pending => fulfilled
resolve('success');
} else {
// pending => rejected
reject('error')
}
})
// 访问promise实例内部的状态
promise.then(res => {
console.log(res)
}).catch(error => {
console.error(error)
})
2)实例方法
.then()
// promise状态为fulfilled
参数:函数,函数内部的参数是resolve传过来的实参
.catch()
// promise状态为rejected
参数:函数,函数内部的参数是reject传过来的实参
.finally()
无论promise状态是成功还是失败,都会执行里面的代码
3)静态方法
Promise.all([pro1,pro2])
将pro1和pro2包装成数组作为实参传递进去
返回值:promise对象。结果 =》pro1,pro2都成功才成功,有一个失败就失败
Promise.race([pro1,pro2])
将pro1和pro2包装成数组作为实参传递进去
返回值:promise对象。结果 =》pro1,pro2谁先回来就用谁都结果(无论成功或者失败)
Promise.any([pro1,pro2])
将pro1和pro2包装成数组作为实参传递进去
返回值:promise对象。结果 =》pro1,pro2都失败才失败,有一个成功就成功
Promise.resolve()
参数:任意
返回值:状态为fulfilled的promise对象
Promise.reject()
参数:任意
返回值:状态为rejected的promise对象
2.Generator
是ES6的异步编程解决方案
类似于状态机,内部封装了多个状态
返回值:迭代器对象
通过调用.next()方法,访问迭代器对象内部的状态
使用:
function* genFun() {
let result = yield 'one'
console.log(result); // hello
yield 'two'
retrun 'others'
}
let gen = genFun(); // gen是generator函数返回的迭代器对象
gen.next();
gen.next('hello')
3.async
async函数是generator函数的语法糖
是ES6的异步编程解决方案
关键字
function关键字前加上 async(异步)
异步请求之前,加上 await(等待)
使用
async function findAll() {
let result = await $.get('......');
console.table(result.data)
}