当前位置: 首页 > Web前端 > HTML

【视频教程】循环中调用异步方法-冰山工作室-沙溢-web前端

时间:2023-04-02 15:46:02 HTML

课程视频--循环中调用异步方法最近遇到一个很有意思的面试题。题目很简单,但是涉及到很多小知识点,挺有意思的。Anormalforloopoutputi//normallywriteaforloopoutputifor(vari=0;i<5;i++){console.log(i);}console.log(i);}假设你是面试官,你能告诉我这几行代码会输出什么吗?,你的内心活动会不会是“这不就是一个循环吗?既然面试官这样问我(他笑肯定不是什么好事,肯定有陷阱),想想,好像是和我看到的那个关于闭包的问题很像,面试官是不是没写完?怎么办。如果你改变一点点,输出是什么?for循环中有一个定时器for(vari=0;i<5;i++){setTimeout(function(){console.log(newDate,i);}1000*i);}console.log(new日期,我);加了点料(setTimeout),看到这道题是不是觉得舒服,是不是觉得“'这不是我记忆中最封闭的闭包题吗?想想看,setTimeout会延迟执行,所以outsidelog会先执行,i是用var声明的,所以变量会被提升,for循环中的i最终会执行i++,i会变成5,没错,这道题我打分了。关闭解决。//closurefor(vari=0;i<5;i++){~function(j){setTimeout(function(){console.log(newDate,j);},1000*j);}(i);}按照前面的程序想“有没有升华的可能,我还能执行01234”实现varroles=['角色1','角色2','角色3'];vararrayTest=[];for(vari=0;i{tasks.push(newPromise((resolve)=>{setTimeout(()=>{console.log(newDate,j);resolve();},1000*j);//定时器超时逐渐增加}));})(i);}Promise.all(tasks).then(()=>{setTimeout(()=>{控制台日志(新日期,我);},1000);});当你成功回答完前面所有的问题后,你有没有想过,可能还有20%的人能回答到你的水平,你怎么能比他们更好呢?可以考虑使用promisesetTimeout和promiseprioritysetTimeout(function(){console.log(1)},0);newPromise(functionexecutor(resolve){console.log(2);for(vari=0;i<10000;i++){i==9999&&resolve();}console.log(3);}).then(function(){console.log(4);});console.log(5);"这道题应该考查我JavaScript的运行机制,让我思考一下,首先遇到一个setTimeout,所以我先设置一个定时器,定时器结束后,我将这个函数传入任务队列,所以肯定不会启动,它会输出1。然后有个Promise,里面的函数是直接执行的,所以应该直接输出23。那么,Promise的then应该放在当前tick的末尾,但是还是在当前tick,所以应该先输出5,再输出4,最后下一个tick是1。"23541"es7constsleep=(timeountMS)=>newPromise((resolve)=>{setTimeout(resolve,timeountMS);});(async()=>{//为(vari=0;i<5;i++)声明和执行的异步函数表达式{awaitsleep(1000);console.log(newDate,i);}awaitsleep(1000);console.log(newDate,i);})();如果你想给面试官一个更强大的关注新技术的印象,让我们说说es7。原版高清视频下载视频讲解--提取码:ifv9QQ问答交流群:600633658本站链接:知乎掘金今日头条新浪微博前端网思无简书B站