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 參考
4 擴展知識