最近兩周都在學(xué)nodejs句旱,雖然之前有自學(xué)過,但是發(fā)現(xiàn)自學(xué)還是有一定缺陷的午磁,所學(xué)的知識只是零碎辱匿。今天就循環(huán)嵌套這個話題進行如下總結(jié):
話題背景是這樣的缝驳⊥炖危基于一個查詢好友列表的實現(xiàn)唯灵,我需要在postman測試顯示出我的好友钝鸽,特別關(guān)心喷户,黑名單三類好友唾那,如下圖:
當(dāng)然我的里面只有好友,特別關(guān)心褪尝、黑名單均為空闹获。
<br />需要的前提,創(chuàng)建好自己的數(shù)據(jù)庫河哑,寫好路由框架避诽。在此,我建立的好友列表和一個用戶列表璃谨。
<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)嵌套的大坑。