陷入Nodejs的循環(huán)嵌套--大坑

最近兩周都在學(xué)nodejs句旱,雖然之前有自學(xué)過,但是發(fā)現(xiàn)自學(xué)還是有一定缺陷的午磁,所學(xué)的知識只是零碎辱匿。今天就循環(huán)嵌套這個話題進行如下總結(jié):
話題背景是這樣的缝驳⊥炖危基于一個查詢好友列表的實現(xiàn)唯灵,我需要在postman測試顯示出我的好友钝鸽,特別關(guān)心喷户,黑名單三類好友唾那,如下圖:

image

當(dāng)然我的里面只有好友,特別關(guān)心褪尝、黑名單均為空闹获。
<br />需要的前提,創(chuàng)建好自己的數(shù)據(jù)庫河哑,寫好路由框架避诽。在此,我建立的好友列表和一個用戶列表璃谨。
image

image

<br />在此沙庐,我就要說說我當(dāng)時是怎么入坑了。因為我的好友列表里面是雙向好友佳吞,user_Id和fri_Id都可能出現(xiàn)我自己的賬號轨功。
<br />
那么我就想了:先判斷user_Id和fri_Id兩個是否存在我的Id,存在再在返回的結(jié)果里面分兩種情況遍歷容达。一種user_Id有我的Id古涧,把fri_Id與用戶基本信息表相連,查詢帶回花盐。想法很完美羡滑,但是實現(xiàn)非常艱難,在執(zhí)行過程中for循環(huán)與查詢根本就是異步的算芯,for執(zhí)行帶回的值就是undefined柒昏,根本無法實現(xiàn)在for里面實現(xiàn)同步操作。我也百度過熙揍,使用ES6的async职祷,step,Promise届囚。對ES6不怎么熟悉的我有梆,用了step試了一下,網(wǎng)上我也不知道是因為寫的函數(shù)簡單還是啥意系,我照百度上的寫了一個step泥耀,終端運行給我報stepundefined...emmm,我step安裝了蛔添,還是給我報...Emmm痰催。之后我就果斷放棄了兜辞。因為我還發(fā)現(xiàn)了另外一個大bug,res.json不能返回多次夸溶,也就是常見的一次請求多次響應(yīng)報錯逸吵。我這種小白實在是扛不住啊。
<br />
之后吧缝裁,我就又想了一個方法扫皱,也就是現(xiàn)在完成的方法。寫個存儲過程压语,設(shè)置兩個傳入的參數(shù)啸罢,分別為用戶Id和好友分類,寫三個方法分別獲取存儲過程的三個好友分類的好友信息胎食。
<br />
思路是這樣的扰才。通過判斷我的賬號里面有沒有好友,有好友就獲取三個分類的好友信息厕怜,沒有就返回衩匣。獲取的時候,我才用的又是循環(huán)嵌套粥航,emmm琅捏,勉強完成了。但是我覺得它的效率并不是很高递雀,明天開始學(xué)ES6柄延,致力搞懂異步和同步吧。
下面是應(yīng)用層和數(shù)據(jù)層的代碼(相應(yīng)的包需要你自己導(dǎo)入哦):

        var userId = req.user[0].base_info_Id
            // console.log(req.user)
        console.log('我的:' + userId)
        messageDAO.friendList(userId, function(err, results) {
            if (err) {
                res.json({ code: 500, msg: '好友列表查詢失斪撼獭搜吧!' })
            } else {
                // console.log(results)
                if (results.length > 0) {
                    messageDAO.friends(userId, function(err, results1) {
                        if (err) {
                            res.json({ code: 500, msg: '好友列表查詢失敗杨凑!' })
                        } else {
                            console.log('好友')
                            console.log(results1[0])
                            messageDAO.attFriends(userId, function(err, results2) {
                                if (err) {
                                    res.json({ code: 500, msg: '好友列表查詢失斅四巍!' })
                                } else {
                                    console.log('關(guān)注')
                                    console.log(results2[0])
                                    results1[1] = results2[0]
                                    console.log(results1)
                                    messageDAO.blackFriends(userId, function(err, results3) {
                                        if (err) {
                                            res.json({ code: 500, msg: '好友列表查詢失斄寐蜒程!' })
                                        } else {
                                            console.log('黑名單')
                                            console.log(results3[0])
                                            results1[2] = results2[0]
                                            res.json({ code: 200, data: results1, msg: '好友列表查詢成功!' })

                                        }
                                    })
                                }
                            })
                        }
                    })
                } else {
                    res.json({ code: 200, data: results, msg: '好友列表無好友伺帘!' })
                }
            }


        })
    }
friendList: function(userId, callback) {
        DAO('select fri_Id,user_Id from friends where (user_Id = 20003 or fri_Id = 20003)and fri_status = 1', [userId, userId], function(err, results) {
            // console.log(results)
            if (err) {
                callback(err, null)
            } else {
                callback(null, results)
            }
        })
    },
    friends: function(userId, callback) {
        DAO('call pro_friends(?,0);', [userId], function(err, results) {
            // console.log(results)
            if (err) {
                callback(err, null)
            } else {
                callback(null, results)
            }
        })
    },
    attFriends: function(userId, callback) {
        DAO('call pro_friends(?,1);', [userId], function(err, results) {
            // console.log(results)
            if (err) {
                callback(err, null)
            } else {
                callback(null, results)
            }
        })
    },
    blackFriends: function(userId, callback) {
        DAO('call pro_friends(?,2);', [userId], function(err, results) {
            // console.log(results)
            if (err) {
                callback(err, null)
            } else {
                callback(null, results)
            }
        })
    }

<br />
希望這個能幫助在初學(xué)nodejs且還沒有學(xué)ES6的童鞋昭躺,避免像我一樣陷入循環(huán)嵌套的大坑。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末曼追,一起剝皮案震驚了整個濱河市窍仰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌礼殊,老刑警劉巖驹吮,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異晶伦,居然都是意外死亡碟狞,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門婚陪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來族沃,“玉大人,你說我怎么就攤上這事泌参〈嘌停” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵沽一,是天一觀的道長盖溺。 經(jīng)常有香客問我,道長铣缠,這世上最難降的妖魔是什么烘嘱? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮蝗蛙,結(jié)果婚禮上蝇庭,老公的妹妹穿的比我還像新娘。我一直安慰自己捡硅,他們只是感情好哮内,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著壮韭,像睡著了一般北发。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上泰涂,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天鲫竞,我揣著相機與錄音,去河邊找鬼逼蒙。 笑死从绘,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的是牢。 我是一名探鬼主播僵井,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼驳棱!你這毒婦竟也來了批什?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤社搅,失蹤者是張志新(化名)和其女友劉穎驻债,沒想到半個月后乳规,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡合呐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年暮的,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片淌实。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡冻辩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拆祈,到底是詐尸還是另有隱情恨闪,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布放坏,位于F島的核電站咙咽,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏轻姿。R本人自食惡果不足惜犁珠,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望互亮。 院中可真熱鬧犁享,春花似錦、人聲如沸豹休。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽威根。三九已至凤巨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間洛搀,已是汗流浹背敢茁。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留留美,地道東北人彰檬。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像谎砾,于是被迫代替她去往敵國和親逢倍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 原博:前端開發(fā)者不得不知的 JavaScript ES6 十大特性轉(zhuǎn)載自AlloyTeam:http://www....
    許吉中閱讀 4,129評論 1 79
  • ES6(ECMAScript2015)的出現(xiàn)景图,無疑給前端開發(fā)人員帶來了新的驚喜较雕,它包含了一些很棒的新特性,可以更加...
    cbw100閱讀 15,415評論 3 233
  • 毫無疑問挚币,nodeJS改變了整個前端開發(fā)生態(tài)亮蒋。本文通過分析nodeJS當(dāng)中events模塊源碼扣典,由淺入深,動手實現(xiàn)...
    LucasHC閱讀 1,862評論 3 17
  • ES6(ECMAScript2015)的出現(xiàn)宛蚓,無疑給前端開發(fā)人員帶來了新的驚喜激捏,它包含了一些很棒的新特性设塔,可以更加...
    gtt21閱讀 226評論 0 0
  • 夜深人靜的時候凄吏,會想起關(guān)于青春、關(guān)于夢想的事闰蛔,總想緬懷什么痕钢,卻又不切實際,生活不是泡沫劇序六,沒那么多的心意去耽擱任连。...
    鹿角隨閱讀 434評論 0 4