参考资料:
- JS Promise API
- ES6 Async/Await 完爆Promise的6个原因
Promise
js的异步处理,一直是使用callback的,但当我们要连续执行多个异步的时候,就会导致callback层层嵌套,很不友好。所以在ES6中,加入了Promise来帮助处理异步
api
- Promise.resolve() 执行成功
- Promise.reject() 执行失败
- Promise.prototype.then() 递延处理
- Promise.all() 所有的完成 Promise.all方法常被用于处理多个promise对象的状态集合
可以这样理解: Promise是一个构造函数,使用时要 new Promise(x)来构造一个对象,其中的参数x是一个函数,(resolve, reject) => { 异步代码返回data },在函数中执行异步代码,如果异步执行成功,则调用resolve(data),错误则调用reject(data),如下列代码:
// 新建一个promise
let myPromise = new Promise((resolve, reject) => {
// 用setTimeout模拟异步
//当异步代码执行成功时,我们才会调用resolve(...),
//当异步代码失败时就会调用reject(...),
//他们的作用就是把返回值传给then()方法
setTimeout(() => {
resolve('执行成功!')
}, 3000)
})
// 使用,其中的successMessage就是resolve(...)方法传入的值
// 然后在then方法中对得到的异步数据进行处理
myPromise.then((successMessage)=>{
console.log(successMessage) // 输出: 执行成功!
})
then方法也返回一个Promise对象,所以可以支持链式调用。
async await
Promise之后,js还推出了另一种异步处理方式,据说比Promise更好用,让我们来看看async 和 await吧。
Async/await建立于Promise之上,很多人认为的最高境界,就是根本不用关心它是不是异步。async await就是异步操作的终极解决方案。
语法
试想一下,我们有一个getJSON方法,该方法发送一个异步请求JSON数据,并返回一个promise对象。这个promise对象的resolve方法传递异步获得的JSON数据。具体例子的使用如下:
getJSON = () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('返回的数据')
},200)
})
}
// 使用Promise
const makeRequest = () =>
getJSON()
.then(data => {
console.log(data)
return "done"
})
makeRequest()
// 使用async await
const makeRequest = async () => {
console.log(await getJSON())
return "done"
}
makeRequest()
说明:使用async/await时,在主体函数前使用async,表示这是个异步函数,await只能使用在async函数内部。当函数执行的时候,一旦遇到await就会先返回,等到异步操作完成,再接着执行函数体内后面的语句。
示例中,await getJSON() 说明console.log的调用,会等到getJSON()返回的promise对象resolve之后触发。