探索async
栏目: JavaScript · 发布时间: 6年前
内容简介:里面如何实现这个我还真不清楚,但是可以通过队列模拟其实现可以看出来
async
本质是什么? 其实就是 generator
的语法糖,虽然 ES6
已经实现了 async
和 generator
,但是在生产环境中都是经过 babel
编译成 promise
.
简单的 async
async function p1(){
console.log(1)
return 1
}
// 等效
function p1(){
console.log(1)
return Promise.resolve(1)
}
复制代码
一般情况的 async
async function p2(){
console.log(2)
let a = await new Promise(resolve => setTimeout(() =>resolve(1), 3000) )
console.log(a);
return 2
};
// 等效
function p2(){
console.log(2)
return Promise.resolve(new Promise(resolve => setTimeout(() =>resolve(1), 3000)).then(res => {
let a = res;
console.log(a)
return Promise.resolve(2)
}))
}
复制代码
循环中的 async
里面如何实现这个我还真不清楚,但是可以通过队列模拟其实现
let p1 = () => new Promise((resolve => setTimeout(() => resolve(1), 1000)));
let p2 = () => new Promise((resolve => setTimeout(() => resolve(2), 2000)));
let p3 = () => new Promise((resolve => setTimeout(() => resolve(3), 3000)));
let ps = [p1, p2, p3];
async function p(){
for (let i = 0; i < 3; i++) {
let a = await ps[i]();
console.log(a)
}
}
// 等效
async function p(){
let queue = [];
for (let i = 0; i < 3; i++) {
queue.push(() => ps[i]().then(res => {
let a = res;
console.log(a)
}))
}
queue.reduce((p1, p2) => p1.then(res => p2()) , Promise.resolve());
};
复制代码
可以看出来 async
简化了 Promise
,大部分场景下 Promise
其实也够用了,但是在链式调用的场景下使用 async
非常简洁. 下面抛出一个问题
let p1 = new Promise((resolve) => resolve(1))
let p2 = new Promise((resolve) => {
resolve(p1);
new Promise(resolve => resolve()).then(() => console.log(2));
})
p2.then(res => console.log(1))
// 为什么先执行2然后执行1?
// 提示: 把resolve(p1)转换一下就很清楚了
复制代码
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。