一道看着比较普通的手写编程题,首先必然想到用定时器,那就直接setTimeout。
for (let i = 1; i < 6; i++) {
setTimeout(() => {
console.log(i)
}, i * 1000)
}
如果用var要向下面这么写,立即执行函数的作用就是形成独立的作用域,因为let有块级作用域属性,而var没有,所以要加一个立即执行函数,还有就是不要忘记传参。
for (var i = 1; i < 6; i++) {
(function (j) {
setTimeout(() => {
console.log(j)
}, j * 1000)
})(i)
}
其它方法?想到异步,还有常见的Promise和Async
思考,如何用Promise和Async实现这个问题
首先需要知道以下一点:
在使用Await时,如果后面跟的函数的返回值是Promise对象,它会等待resolve执行完,再执行下面的。反之,如果后面跟的函数的返回值是非Promise对象,则立即执行。
利用以上一点,即可实现这个问题
function delay(i) {
return new Promise((resolve) => {
setTimeout(() => {
console.log(i);
resolve();
},1000)
})
}
async function fn() {
for (let i = 1; i < 6; i++) {
await delay(i);
}
}
fn()