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的那些坑(四)——如何讓異步並發方法同步順序執行


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM