视频课程-循环中调用异步方法

课程视频--for循环里的setTimeout

一个普通的for循环里面log一下 i

// 正常写一个for循环输出i
for (var i = 0; i < 5; i++) {
    console.log(i);
}
console.log(i);
复制代码

假设你是一个面试者,你说说这几行代码会输出什么?,你的内心活动会不会是“这特么不就是一个循环吗?面试官既然这么问老子(他还笑肯定不是好东西,肯定有陷阱),好好想一下,这好像和我看的那个闭包的题很像啊,这面试官是不是没写完啊?怎么办。”

如果稍微改动一些尼,输出结果又是什么?

for循环中有一个定时器

 for (var i = 0; i < 5; i++) {
    setTimeout(function () {
        console.log(new Date, i);
    }1000 * i);
}
console.log(new Date, i);
复制代码

稍微加了点料(setTimeout)后,是不是看到这道题就舒服了,会不会想“’这不是老子背的最多的闭包问题么,想一哈,setTimeout是会延迟执行的所以外面的log会先执行,i是用var声明的,所以会变量提升,for循环里i最后执行完i++,i变成了5,没错了,老子这题得分了。

使用闭包

// 闭包
for (var i = 0; i < 5; i++) {
    ~function (j) {
        setTimeout(function () {
            console.log(new Date, j);
        }, 1000 * j);
    }(i);
}
复制代码

顺着上一个程式想“是不是还可以升华一下,我还能执行出来0 1 2 3 4

真实实作

var roles = ['角色1', '角色2', '角色3'];
var arrayTest = [];
for (var i = 0; i < roles.length; i++) {
    !function (i) {
        $.get('https://www.baidu.com', { role: roles[i] }, function (res) {
            console.log(i);
            arrayTest[i] = i + roles[i] + res;
        })
    }(i);
}
复制代码

如果你登录一个后台系统,这个账号下有不同角色(角色不固定,后期可能增加),传不同角色进行ajax请求得到相应渲染页面的数据,但是这个接口只接收一个角色参数, 那我们应该怎么按我 们想要的顺序获取数据然后渲染页面?

使用ES6

const tasks = [];
for (var i = 0; i < 5; i++) {
    ((j) => {
        tasks.push(new Promise((resolve) => {
            setTimeout(() => {
                console.log(new Date, j);
                resolve();
            }, 1000 * j); // 定时器的超时时间逐步增加
        }));
    })(i);
}

Promise.all(tasks).then(() => {
    setTimeout(() => {
        console.log(new Date, i);
    }, 1000);
});
复制代码

当你前面所有问题都顺利的回答完了,你想没想过可能还有20%的人可以回答到你这种程度,怎么能变现的比他们牛逼一点尼?你可以考虑使用一下promise

setTimeout 和 promise 的优先级

setTimeout(function () {
    console.log(1)
}, 0);
new Promise(function executor(resolve) {
    console.log(2);
    for (var i = 0; i < 10000; i++) {
        i == 9999 && resolve();
    }
    console.log(3);
}).then(function () {
    console.log(4);
});
console.log(5);
复制代码

这道题应该考察我 JavaScript 的运行机制的,让我理一下思路。

首先先碰到一个 setTimeout,于是会先设置一个定时,在定时结束后将传递这个函数放到任务队列里面,因此开始肯定不会输出 1 。

然后是一个 Promise,里面的函数是直接执行的,因此应该直接输出 2 3 。

然后,Promise 的 then 应当会放到当前 tick 的最后,但是还是在当前 tick 中。

因此,应当先输出 5,然后再输出 4 。

最后在到下一个 tick,就是 1 。

2 3 5 4 1

使用ES7

const sleep = (timeountMS) => new Promise((resolve) => {
    setTimeout(resolve, timeountMS);
});

(async () => { // 声明即执行的 async 函数表达式
    for (var i = 0; i < 5; i++) {
        await sleep(1000);
        console.log(new Date, i);
    }

    await sleep(1000);
    console.log(new Date, i);
})();
复制代码

要是想给面试官留一个关注新技术的更牛逼印象,那就用es7说一下吧。

关于我们

视频课程在线观看-----传送门

视频课程网盘地址-----传送门 提取码: ifv9

冰山社团官网地址-----传送门

如果观看视频或文档后,你觉得有些收获,愿意加入冰山社团与我们一同成长,请进入我们的官网,点击冰山社团,加入我们~

转载于:https://juejin.im/post/5c91ce1ef265da612e6d5abc

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScript事件循环是JavaScript用于处理异步操作的机制。由于JavaScript是单线程的,它无法同时执行多个任务。为了处理异步任务,JavaScript引入了事件循环机制。 事件循环主要由以下几个组成部分: 1. 调用堆栈(Call Stack):用于存储函数调用的记录。当函数被调用时,会将其压入调用堆栈,当函数执行完毕后,会从调用堆栈弹出。 2. 任务队列(Task Queue):用于存储待处理的异步任务。当异步任务完成时,会被添加到任务队列。 3. 事件循环(Event Loop):负责监听调用堆栈和任务队列的状态,当调用堆栈为空时,会从任务队列取出任务并执行。 事件循环的工作流程如下: 1. JavaScript引擎执行同步任务,并将异步任务添加到任务队列。 2. 当调用堆栈为空时,事件循环会从任务队列取出一个任务。 3. 取出的任务会被压入调用堆栈执行。 4. 执行完毕后,调用堆栈为空,事件循环继续从任务队列取出任务执行。 这样循环执行,实现了异步任务的处理。 相关问题: 1. 什么是异步任务?为什么需要处理异步任务? 2. JavaScript如何处理异常? 3. JavaScript的回调函数是什么?如何使用回调函数处理异步任务? 4. 什么是Promise?如何使用Promise处理异步任务? 5. JavaScript的定时器有哪些?它们是如何工作的? 6. 什么是事件驱动编程?如何在JavaScript使用事件驱动编程? 7. JavaScript的Event Loop与浏览器的渲染机制有什么关系?<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [详解JavaScript事件循环机制](https://download.csdn.net/download/weixin_38694006/13608655)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [浏览器显示数据库数据的条形图柱状图 前后端分离vue.js+spring boot 计算机软件工程课程设计毕业设计 ...](https://download.csdn.net/download/Amzmks/88275824)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值