美文网首页
for循环里的异步操作如何处理

for循环里的异步操作如何处理

作者: Amy_yqh | 来源:发表于2020-02-29 23:20 被阅读0次

首先来看一个比较简单的问题,我们想实现的就是每隔1s输出0-4的值,就是这么简单,看下错误写法:

function test() {
    for (var i = 0; i < 5; ++i) {
        setTimeout(function() {
            console.log("index is :", i);
        }, 1000);
    }
}
test();

以上代码会如何输出?输出如下

index is : 5
index is : 5
index is : 5
index is : 5
index is : 5

而且该操作几乎是在同一时间完成,setTimeout定时根本就没有起作用,这是因为:单线程的js在操作时,对于这种异步操作,会先进行一次“保存”,即把异步操作放到堆栈中,等前面的程序执行完,堆栈中的异步操作就会执行。等到整个for循环执行结束后,此时i的值已经变成5,因为setTimeout是写在for循环中的,相当于存在5次定时调用,这5次调用均是在for循环结束后进行的,所以自然而然输出都是5,正确的实现有几种,一般情况下,如下:

递归

box6();
 
function box7(param) {
    if (param < 5) {
        console.log("index is :", param);
        setTimeout(function() {
            box7(param + 1);
        }, 1000)
    }
}
box7(0);

正确实现每隔1s打印输出如下:

index is : 0
index is : 1
index is : 2
index is : 3
index is : 4

使用递归实现的倒计时:

function showTime(count) {
    console.log("count is : ", count);
    if (count == 0) {
        console.log("All is Done!");
    } else {
        count -= 1;
        setTimeout(function() {
            showTime(count);
        }, 1000);
    }
}
 
showTime(20);

自执行函数

function test() {
    for (var i = 0; i < 5; ++i) {
        (function(i){
        setTimeout(function() {
            console.log("index is :", i);
        }, 1000)
        })(i)
    }
}
test();

异步操作使用异步函数包裹起来,i每次执行都不把i作为参赛传到函数中

let 声明i

function test() {
    for (let i = 0; i < 5; ++i) {
        setTimeout(function() {
            console.log("index is :", i);
        }, 1000)
    }
}
test();

使用let定义i变量,let 的的作用域是块级作用域

async、await实现

var asyncFunc = function(arr, i) {
    return new Promise(function(resolve, reject) {
        setTimeout(function() {
            arr.push(i);
            console.log("index is : ", i);
            resolve();
        }, 1000);
    });
}
 
var box5 = async function() {
    var arr = [];
    for (var i = 0; i < 5; i++) {
        await asyncFunc(arr, i);
    }
    console.log(arr);
}
 
box5();

同样实现每隔1s正确地打印输出如下:

index is :  0
index is :  1
index is :  2
index is :  3
index is :  4
[ 0, 1, 2, 3, 4 ]

使用promise,函数会等待他执行完才会继续执行下一行代码,相当于是同步代码

相关文章

  • iOS、for循环里的异步任务完成再进行其他操作

    for循环里的异步任务完成再进行其他操作 队列组处理for循环里的异步任务

  • for循环里的异步操作如何处理

    首先来看一个比较简单的问题,我们想实现的就是每隔1s输出0-4的值,就是这么简单,看下错误写法: 以上代码会如何输...

  • for循环里的异步操作如何处理

    首先来看一个比较简单的问题,我们想实现的就是每隔1s输出0-4的值,就是这么简单,看下错误写法: 以上代码会如何输...

  • JavaScript 异步循环 - async/await 的使

    如何以顺序或并行方式运行异步循环? 在对循环进行异步处理之前,我想提醒您如何编写经典的同步循环。 同步循环 很久以...

  • Dart-3的异步模型

    1-Dart的异步模型 1.1 如何处理耗时的操作呢? 针对如何处理耗时的操作,不同的语言有不同的处理方式。 处理...

  • Redux中middleware小结

    为什么出现middleware? 为了解决异步操作。 middleware如何处理异步的? Action 发出以后...

  • 循环串行异步 Promise

    有时候会有这一种需要,需要在循环中执行一系列操作。但是循环的每次迭代的操作是异步的,此时如何实现“异步串行”呢? ...

  • 浏览器中的事件循环与Node中的事件循环

    浏览器中的事件循环 JS线程读取并执行JS代码 执行JS代码的过程中,指定异步的操作给对应的线程处理 异步线程处理...

  • ES6 Primise异步编程

    异步操作流程化的手段 #Promise处理异步操作 Promise,使异步操作变得流程化的手段之一,例如“异步A ...

  • AndroidFlux-异步请求和网络

    在移动开发中,异步网络操作必不可少,本篇着重介绍在Flux模式中如何处理异步操作的问题,并深入一些细节,比如如何在...

网友评论

      本文标题:for循环里的异步操作如何处理

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