异步编程 | Js实现定时打印的几种方式
前几周学习了《》、《》、《》、《》、《》、《》。本篇来看看分别用setTimeout、Promise、async/await、Genarator来实现定时打印数组中的值的实现。
只有Es5时的实现方式
闭包+递归+setTimeout:
//闭包+递归+setTimeout
const list = [1, 2, 3];
function show() {
let count = 0;
return function showArr(arr) {
setTimeout(() => {
console.log("打印:", arr[count++]);
if (count === arr.length) {
return;
}
showArr(arr);
}, 1000);
};
}
const showArr = show();
showArr(list);
有了ES6的实现方式
1、promise+async/await+for循环:
//promise+await+for循环
const list = [1, 2, 3];
const square = (num) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(num);
}, 1000);
});
};
async function showArr(list) {
for(let item of list) {
let value = await square(item)
console.log("打印:", value);
}
}
showArr(list)
2、Generator+async/await+for...of循环
const list = [1, 2, 3];
function* square(value) {
yield new Promise((rs,rj)=> {
setTimeout(() => {
rs(value)
console.log("打印:", value);
}, 1000*value);
})
}
function showArr(list) {
for(let item of list) {
let obj = square(item)
console.log('obj:', obj)
let next = obj.next() //前面一个next执行完后面的next才会执行
}
}
showArr(list)
关于Generator实现的要点是,调用Generator的迭代器,只有通过迭代器的next方法才能执行下一个yield结果,不调用不会执行yield语句;且多个next()语句是按照其代码书写顺序执行。也就是,调用多个迭代器的next(),按书写顺序逐一调用yield语句后面的表达式。
更多:for...of会自动调用Generator函数,且按语句书写顺序逐一执行函数中的yield语句。
function* foo() {
yield 1;
yield 2;
yield 3;
yield 4;
yield 5;
return 6; //没有return执行效果一样
}
for (let v of foo()) {
console.log(v);
}
// 1 2 3 4 5