zoukankan      html  css  js  c++  java
  • Node.js的那些坑——如何让异步并发方法同步顺序执行(for循环+异步操作)

    1 前言

    nodejs的回调,有时候真的是让人又爱又恨的,当需要用for循环把数据依次存入数据库,但是如果使用正常的for循环,永远都是最后一次值的记录,根本不符合要求。

    解决此方案有几种,例如闭包(这里利用js函数编程的特性,建立一个闭包来保存每次需要的i值),详情参见参考1和Asyn函数,然后函数的forEach方法也是居于它实现的。

    注:async主要实现了很多有用的函数,例如:

    • each: 如果想对同一个集合中的所有元素都执行同一个异步操作。
    • map: 对集合中的每一个元素,执行某个异步操作,得到结果。所有的结果将汇总到最终的callback里。与each的区别是,each只关心操作不管最后的值,而map关心的最后产生的值。
    • series: 串行执行,一个函数数组中的每个函数,每一个函数执行完成之后才能执行下一个函数。
    • parallel: 并行执行多个函数,每个函数都是立即执行,不需要等待其它函数先执行。传给最终callback的数组中的数据按照tasks中声明的顺序,而不是执行完成的顺序。
    • 其它

    2 代码

    //userIdArr是用户列表
    userIdArr.forEach(function(userId){
                //var userId = userIdArr[i];
                db.get_users_stat(userId, function (data) {
                    if (data == null) {
                        //说明是新用户
                        var argsMap = {"userId": userId};
                        db.insert_users_stat(userId, argsMap, function (data2) {
                            if (data2 == null) {
                                callback(null);
                                return;
                            }
                            var index = getIndex(userData,userId);
                            updateUserStat(userData[index]);
    
                        });
    
                    } else {
                        var index2 = getIndexs(userData,userId);
                        updateUserStat(userData[index2]);
                    }
    
                });
            });  

    3 参考

    1. node.js在遇到“循环+异步”时的注意事项

    4 扩展知识

    1. Node.js的那些坑(三)——如何在异步方法都执行后再执行

    2. Node.js的那些坑(四)——如何让异步并发方法同步顺序执行

  • 相关阅读:
    Redis进阶
    redis常用指令
    MarkDown基本语法
    JAVA多线程面试
    使用POI操作Excel
    IDEA+GIT的使用
    获取地址栏的参数
    mybatis逆向工程
    遍历map集合
    springboot批量删除
  • 原文地址:https://www.cnblogs.com/fanbi/p/9453609.html
Copyright © 2011-2022 走看看