zoukankan      html  css  js  c++  java
  • 关于for循环里面异步操作的问题

    一、使用自执行函数

      1、当自执行函数在循环当中使用时,自执行函数会在循环结束之后才会运行。比如你在自执行函数外面定义一个数组,在自执行函数当中给这个数组追加内容,你在自执行函数之外输出时,会发现这个数组当中仕么都没有,这就是因为自执行函数会在循环运行完后才会执行。

      2、当自执行函数在循环当中使用时,要是自执行函数当中嵌套ajax,那么循环当中的下标i就不会传进ajax当中,需要在ajax外面把下标i赋值给一个变量,在ajax中直接调用这个变量就可以了。

      例子:

    $.ajax({
        type: "GET",
        dataType: "json",
        url: "***",
        success: function(data) {
            //console.log(data);               
            for (var i = 0; i < data.length; i++) {
                (function(i, abbreviation) {
                    $.ajax({
                        type: "GET",
                        url: "/api/faults?abbreviation=" + encodeURI(abbreviation),
                        dataType: "json",
                        success: function(result) {
                            //获取数据后做的事情
                        }
                    })
                })(i, data[i].abbreviation);
            }
        }
    });

    二、使用递归函数

    所谓的递归函数就是在函数体内调用本函数。使用递归函数一定要注意,处理不当就会进入死循环。

    const asyncDeal = (i) = > {
        if (i < 3) {
            $.get('/api/changeParts/change_part_standard?part=' + data[i].change_part_name, function(res) {
                //获取数据后做的事情
                i++;
                asyncDeal(i);
            })
        } else {
            //异步完成后做的事情
        }
    };
    asyncDeal(0);

    三、使用async/await

    async/await特点

    1. async/await更加语义化,async 是“异步”的简写,async function 用于申明一个 function 是异步的; await,可以认为是async wait的简写, 用于等待一个异步方法执行完成;

    2. async/await是一个用同步思维解决异步问题的方案(等结果出来之后,代码才会继续往下执行)

    3. 可以通过多层 async function 的同步写法代替传统的callback嵌套

    async function语法

    • 自动将常规函数转换成Promise,返回值也是一个Promise对象

    • 只有async函数内部的异步操作执行完,才会执行then方法指定的回调函数

    • 异步函数内部可以使用await

    await语法

    • await 放置在Promise调用之前,await 强制后面点代码等待,直到Promise对象resolve,得到resolve的值作为await表达式的运算结果

    • await只能在async函数内部使用,用在普通函数里就会报错

    const asyncFunc = function(i) {
        return new Promise(function(resolve) {
            $.get(url, function(res) {
                resolve(res);
            })
        });
    }
    const asyncDeal = async function() {
        for (let i = 0; i < data.length; i++) {
            let res = await asyncFunc(i);
            //获取数据后做的事情
        }
    }
    asyncDeal();
  • 相关阅读:
    iOS 类知乎”分页”效果的实现?
    iOS 图解弹幕功能的实现
    iOS 为何使用runtime方法交换多次后却能按照交换顺序依次执行代码逻辑?
    iOS常用算法之单链表查找倒数第n个节点(图解)
    iOS常用算法之两个有序数组合并, 要求时间复杂度为0(n)
    iOS 常用算法之设计一个算法,验证某字符是否为合法IPV4字符
    iOS .Crash文件分析处理办法 (利用symbolicatecrash工具处理)
    iOS中UIWebview中网页宽度自适应的问题
    iOS开发
    安卓应用加固之反动态调试技术总结
  • 原文地址:https://www.cnblogs.com/ziyoublog/p/9443726.html
Copyright © 2011-2022 走看看