优点:
缺点:
需求:弹框弹出后的初始情况下,就让这个弹出框处于数据加载中
的状态,当这两部分数据都从接口获取到的时候,才让这个数据加载中
状态消失。让用户看到这两部分的数据。
这时我们就需要:两个异步接口请求任务都完成的时候做处理,所以此时,使用Promise.all方法,就可以轻松的实现
Promise.race赛跑机制,只认第一名,就是说promise.race([p1, p2, p3])里哪个结果捕获的快,就返回哪个结果
不管成功还是失败
Promise.race其实使用的并不多,如果真要使用。我们可以提出这样一个需求:
比如:点击按钮发请求,当后端的接口超过一定时间,假设超过三秒,没有返回结果,我们就提示用户请求超时
Promise.resolve()
封装成 Promise 对象。async function fn1(){
return 123
}
function fn2(){
return 123
}
console.log(fn1()) //Promise {: 123}
console.log(fn2()) //123
async函数返回一个 Promise 对象,所以 await 可以用于等待一个 async 函数的返回值
右侧如果是函数,那么函数的return值就是「表达式的结果」
右侧如果是一个 ‘hello’ 或者什么值,那表达式的结果就是 ‘hello’
//Promise.then 成功情况 对应 await
async function test3 () {
const p3 = Promise.resolve(3);
p3.then(data => {
console.log('data', data); //data 3
})
const data = await p3;
console.log('data', data); //data3
}
test3(); //因此Promise.then 可以 await代替
async/await 的优势在于处理 then 链:
https://segmentfault.com/a/1190000007535316
分两种情况:
1.不是promise对象
2.是promise对象
async function async1() {
console.log( 'async1 start' )
await async2()
console.log( 'async1 end' )
}
async function async2() {
console.log( 'async2' )
}
console.log( 'script start' )
setTimeout( function () {
console.log( 'setTimeout' )
}, 0 )
async1();
new Promise( function ( resolve ) {
console.log( 'promise1' )
resolve();
} ).then( function () {
console.log( 'promise2' )
} )
console.log( 'script end' )
注:答案是以浏览器的eventloop机制为准的,在node平台上运行会有差异
script start
async1 start
async2
promise1
script end
async1 end
promise2
setTimeout
1.直接打印同步代码 console.log(‘script start’)
首先是2个函数声明,虽然有async关键字,但不是调用我们就不看。然后首先是打印同步代码 console.log('script start')
2.将setTimeout放入宏任务队列
3.调用async1,打印 同步代码 console.log( ‘async1 start’ )
4.遇到await async2()
1.它先计算出右侧的结果,2.然后看到await后,中断async函数
- 先得到await右侧表达式的结果。执行async2(),打印同步代码console.log('async2'), 并且return Promise.resolve(undefined)
- await后,中断async函数,先执行async外的同步代码
目前就直接打印 console.log('async2')
被阻塞后,执行async之外的代码
5.执行new Promise(),Promise构造函数是直接调用的同步代码,所以 console.log( ‘promise1’ )
代码运行到promise.then()
代码运行到promise.then(),发现这个是微任务,所以暂时不打印,只是推入当前宏任务的微任务队列中。
6.打印同步代码console.log( ‘script end’ )
7.执行微任务打印console.log( ‘async1 end’ )
8.执行微任务打印promise2
9.执行宏任务console.log(‘setTimeout’)