javascript - promise mongoose 循環(huán)遍歷查詢
問(wèn)題描述
let result = []; //存放查詢結(jié)果model.WithdrawModel.find({status:’processing’}, (err, doc) => { if (err) {console.log(err);res.json({ code: -1, msg: ’查詢失敗’});return; } else {doc.map((item) => { model.UserModel.findOne({phone:item.phone},’name IDcard bank bankCard bank_area bank_name’, (err, bankInfo) => {if (err) { console.log(err);} else { let obj = {}; Object.assign(obj, JSON.parse(JSON.stringify(item)), JSON.parse(JSON.stringify(bankInfo))); result.push(obj); console.log(result); } })});res.json({ code: 0, msg: ’查詢成功’, result: result});return; } });
循環(huán)遍歷查詢,上述 result 直接返回空值,請(qǐng)問(wèn)怎么保證 doc.map 內(nèi)部的查詢都結(jié)束之后再取出 result 的值?
問(wèn)題解答
回答1:自問(wèn)自答吧,也是受人指點(diǎn)。
promise.all 實(shí)現(xiàn)如下:
let result = []; //存放查詢結(jié)果let doc1 = []; //存放第一次查詢的結(jié)果model.WithdrawModel.find({status:’processing’}).exec().then((doc) => { doc1 = doc; const promises = doc.map(item => model.UserModel.findOne({phone:item.phone},’name IDcard bank bankCard bank_area bank_name’)); return Promise.all(promises);}).then((bankInfoList) => {//promise.all返回的結(jié)果是一一對(duì)應(yīng)的 for(let i=0; i<doc1.length; i++){let obj = {};Object.assign(obj, JSON.parse(JSON.stringify(doc1[i])), JSON.parse(JSON.stringify(bankInfoList[i])));result.push(obj); } return new Promise((resolve, reject) => { resolve(result); }) }).then((result) => { return new Promise(() => {res.json({ code: 0, msg: ’查詢成功’, result: result});return; });}).catch((e) => { console.log(e); res.json({ code: -1, msg: ’查詢失敗’}); return;});
--------------------------------------補(bǔ)充-------------------------------------------------
計(jì)數(shù)的思想仍然是可以實(shí)現(xiàn)的,使用 event 模塊即可:
由于Promise是異步調(diào)用,所以在所有的查詢之后使用return,會(huì)在還沒(méi)真正獲取到數(shù)據(jù)之后就返回,所以需要Promise內(nèi)添加一個(gè)計(jì)數(shù)器count,在所有的Promise下,加一個(gè)循環(huán),當(dāng)所有的doc都循環(huán)到了(count == doc.length),才可以輸出返回。
const deasync = require(’deasync’); // 引入deasync包...let result = []; //存放查詢結(jié)果model.WithdrawModel.find({status: ’processing’}, (err, doc) => { if(err) {console.log(err);res.json({code: -1, msg: ’查詢失敗’});return; } else {let count = 0, len = doc.length;doc.forEach((item, index) => { model.UserModel.findOne({phone: item.phone}, ’name IDcard bank bankCard bank_area bank_name’, (err, bankInfo) => {if (err) { console.log(err);} else { let obj = {}; Object.assign(obj, JSON.parse(JSON.stringify(item)), JSON.parse(JSON.stringify(bankInfo))); result.push(obj); console.log(result); }count++; });});deasync.loopWhile(() => count < len);res.json({code: 0, msg: ’查詢成功’, result: result});return; }});
相關(guān)文章:
1. docker-compose中volumes的問(wèn)題2. mysql 一個(gè)sql 返回多個(gè)總數(shù)3. CSS3 畫(huà)如下圖形4. 在mac下出現(xiàn)了兩個(gè)docker環(huán)境5. 如何用筆記本上的apache做微信開(kāi)發(fā)的服務(wù)器6. angular.js - ionic2 瀏覽器跨域問(wèn)題7. javascript - 螞蟻金服里的react Modal方法,是怎么把元素插入到頁(yè)面最后的8. android - rxjava merge 返回Object對(duì)象數(shù)據(jù)如何緩存9. docker 下面創(chuàng)建的IMAGE 他們的 ID 一樣?這個(gè)是怎么回事????10. python - Scrapy存在內(nèi)存泄漏的問(wèn)題。
