1、Promise 对象
①:Promise可以看作为一个容器,容器内部装着未来才会结束的异步操作;
②:Promise用于三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败);
③:状态一旦开始,只有两种可能:从 pending 变为 fulfilled 和从 pending 变为 rejected,且只会有一个最终结果;
④:Promise对象是一个构造函数,用来生成Promise实例,接受一个携带两种处理状态的回调函数(resolve、resject);
2、Promise 基础使用
var Promise_1 = new Promise((resolve, reject) => {
//异步操作
setTimeout(() => {
let Data = true //判断条件
if (Data) {
resolve('异步执行成功!') //操作成功
} else {
reject('异步执行失败!') //操作失败
}
}, 1000)
})
Promise_1.then(res => { //then接收成功状态
console.log(res)
}).catch(error => { //catch捕获异常
console.error(error)
})
使用字面量接收Promise返回值、new关键字创建Promise实例,实例接收一个回调函数,携带resolve、reject两个方法;
实例生成之后可以使用.then()/.catch()方法接收Promise的状态返回值;
上述代码、Promise实例新建成功之后立即执行,判断条件Data为true,所以调用resolve方法,然后then方法指定的回调函
数,将在当前脚本所有同步任务执行完才会执行,所以输出结果为 ‘异步执行成功!’。
3、Promise 链式调用
var Promise_1 = new Promise((resolve, reject) => {
//异步操作
setTimeout(() => {
let Data = true //判断条件
if (Data) {
resolve('异步执行成功!') //操作成功
} else {
reject('异步执行失败!') //操作失败
}
}, 1000)
})
Promise_1.then(res => { //then接收成功状态
console.log(res)
return res + '链式调用1'
}).then(res => {
console.log(res) //异步执行成功!链式调用1
})
所谓链式调用,就是可以一直then下去,假设我们第一次拿到的数据需要再次异步处理之后才可以继续使用,那么就需要链
式调用,很简单 只需要在上一次then中返回当前数据即可。
4、Promise 同时执行
应用场景:假设需要同时获取百度地图、网易新闻、哔哩哔哩三个网站开放数据,此时我们就需要发送三个不同的异步请求
来获取数据,怎么办呢? Promise.all( )很好的解决了这个需求。
var baidu = new Promise((resolve, reject) => {
setTimeout(() => { resolve('百度数据')}, 1000)
})
var wnagyi = new Promise((resolve, reject) => {
setTimeout(() => { resolve('网易数据')}, 2000)
})
var bili = new Promise((resolve, reject) => {
setTimeout(() => { resolve('哔哩哔哩数据')}, 500)
})
Promise.all([baidu, wnagyi, bili]).then(res => {
console.log(res) //["百度数据", "网易数据", "哔哩哔哩数据"]
}).catch(err => {
console.error(err) //捕获异常
})
需要注意的是Promise.all()实参是所有Promise实例的字面量组成的数组,执行完毕的结果是所有输出结果的所组成的数
组;
5、async / await
首先了解async干了什么事情?我们先写段简单代码,看看async的函数返回值究竟是什么?
async function testAsync() {
return 'hello async'
}
console.log(testAsync()) //输出 Promise对象
看到输出就恍然大悟了——输出的是一个 Promise 对象。
如果需要拿到 testAsync函数的返回值我们只需要使用Promise原型上的.then()方法即可;因为如果在函数中 return
一个直接量,
async 会把这个直接量通过 Promise.resolve()
封装成 Promise 对象;
async function testAsync() {
return 'hello async'
}
testAsync().then(res => {
console.log(res) //输出 hello async
})
一般来说,都认为 await 是在等待一个带有 async 的函数执行完毕。不过按语法说明,await 等待的是一个表达式,这个表达式的计算结果是 Promise 对象或者其它值。
因为 async 函数返回一个 Promise 对象,所以 await 可以用于等待一个 async 函数的返回值——这也可以说是 await 在等 async 函数,但要清楚,它等的实际是一个返回值。要注意它可以等任意表达式的结果,所以,await 后面实际是可以接普通函数调用或者直接量的。所以下面这个示例完全可以正确运行:
function testAsync() { //只有返回值、没有返回Promise的函数
return 'hello async'
}
function testPromise() { //返回Promise的函数
return new Promise(resolve => {
resolve('hello Promise')
})
}
async function test() {
var Async_1 = await testAsync()
var Promise_1 = await testPromise().then()
console.log(Async_1) //输出 hello async
console.log(Promise_1) //输出 hello Promise
}
test() //执行
由上可知,只要await的函数有了返回值即走下一个await!
如果我的博客帮助你解决了开发问题,请不要吝啬你的小红心哦!❤
● 若有错误欢迎指出、及时修正 ●