可以看出来,setInterval() 中的代码是在一定时间之后才执行的(如果给 new_time 赋了初始值就更明显。这是因为 setInterval() 中的是异步代码,它和主流程中的代码不是走在同一个阻塞线上。
接下来改造一个,我们用 async/await 来等待异步过程结束
async function testAsync() {
var new_time;
console.log("[1]", new_time);
let counter = 0;
await new Promise(resovle => {
const timer = setInterval(function() {
new_time = new Date();
console.log("[2]", new_time);
if (++counter > 5) {
clearInterval(timer);
resovle();
}
}, 1000);
});
console.log("[3]", new_time);
}
testAsync()
输出
[1] undefined
[2] 2019-07-11T03:54:52.675Z
[2] 2019-07-11T03:54:53.675Z
[2] 2019-07-11T03:54:54.675Z
[2] 2019-07-11T03:54:55.675Z
[2] 2019-07-11T03:54:56.675Z
[2] 2019-07-11T03:54:57.675Z
[3] 2019-07-11T03:54:57.675Z
可以看到 [3] 是在异步结束之后执行的,因为异步过程用 Promise 封装之后,还使用 await 来等待它结束。
关于异步过程,我一时半会儿也不好解释清楚,给你推荐几个参考:
异步编程需要“意识”
理解 JavaScript 的 async/await
从地狱到天堂,Node 回调向 async/await 转变