美文网首页
视频课程-循环中调用异步方法

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

作者: 冰山工作室沙翼 | 来源:发表于2019-03-20 15:49 被阅读0次
冰山工作室出品
视频课程-循环中调用异步方法

课程目录

  1. 一个普通的for循环里面log一下 i
  2. for循环中有一个定时器
  3. 使用闭包
  4. 真实实作
  5. 使用ES6
  6. setTimeout 和 promise 的优先级
  7. 使用ES7
  8. 关于我们

一个普通的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
冰山社团官网地址-----传送门

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

相关文章

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

    课程目录一个普通的for循环里面log一下 ifor循环中有一个定时器使用闭包真实实作使用ES6setTimeou...

  • 2018-03-13 Spring中的异步调用

    异步方法调用 异步方法调用或异步方法模式是(多线程)面向对象程序设计中用于异步调用对象的潜在的长期运行方法的一种设...

  • 实现异步转同步

    极客时间-《Java并发编程实战》学习笔记 异步方法:调用方法,在方法中启动子线程异步调用:启动子线程调用方法异步...

  • 2020-11-23 在List中调用异步函数

    每天一难:业务场景: 先取到ListA,然后在循环中调用另外一个异步函数,等所有的异步函数都调用成功后,集合所有的...

  • 并发编程的一些概念

    同步:同步方法调用一旦开始,调用者必须等到方法调用返回,才能继续后续的工作。 异步:异步方法就不需要等到方法调用返...

  • java 异步调用方法

    异步方法 其他方法要使用异步时,直接调用fun()方法即可

  • Spring中使用@Async异步调用方法

    摘要 异步调用传统SSM项目实现 异步调用SpringBoot实现 Async简介: 异步方法调用使用场景:处理日...

  • 关于高并发的几个重要概念

    1.1 同步和异步 首先这里说的同步和异步是指函数/方法调用方面。 很明显,同步调用会等待方法的返回,异步调用会瞬...

  • 实战Java高并发程序设计笔记第一章

    相关术语 同步和异步 同步和异步用来形容一次方法调用。 同步:方法调用一旦开始,调用者必须等到方法调用结束后,才能...

  • 多线程基本概念

    1.同步&异步 同步和异步通常用来形容一次方法的调用。 同步方法一旦开始调用,调用者必须等待调用方法的返回,才能继...

网友评论

      本文标题:视频课程-循环中调用异步方法

      本文链接:https://www.haomeiwen.com/subject/szzzmqtx.html