簡體   English   中英

NodeJS 和 MongoDB 中的異步故障

[英]async trouble in NodeJS and MongoDB

我正在嘗試創建一個數組,該數組應該有一個帶有開放引號的項目。 我在 Mongo 中有一個帶有鍵“open_quotation”的 Items DB,如果該項目沒有報價 => open_quotation:null。 我想 map 所有數組項目並檢查是否有此項目的任何未結報價,如果有未結報價 - 我想將其推送到我創建的另一個陣列,並發送給客戶。 問題是,當我對項目數組執行 map 方法時,它是異步 function 並且在發送響應之后我已經得到了一個數組......所以客戶端將它作為一個空數組接收。 請幫助解決這個問題。

const{items}= req.body;
const quotations=[];
items.map(async item=>{ const i=await Item.findOne({_id: item._id})
if(i){
`if(i.openquotation){ quotations.push(i)}`
return
)}
res.send({response: true, quotations:quotations}) 



`````

你能試試嗎:

try {
    const response = await Promise.all(items.map(item => Item.findOne({_id: item._id})));
    const quotations = response.filter((elem) => !!elem.openquotation);
    res.send({ response: true, quotations });
} catch (error) {
    res.send({ response: false, error });
}

您可以使用asyncq模塊在循環中查找查詢

當你運行mainFunction()時, mainFunction調用getData()

let async = require('async');
let q = require('q');

const mainFunctio = async()=>{
  const{items}= req.body
  console.log("start")
  resultFromFindLoob  = await getData(items)
  console.log("finish");
  console.log(resultFromFindLoob)
}


const getData = async (items)=>{
  let defer =q.defer();
  let result = []
  async.eachSeries(items , async(item)=>{ // like a for
    try {
      let i = await Item.findOne({_id: item._id}).lean();
      //do something for result (processing)
      if(i)
      result.push(i)
    } catch (error) {
      console.log(error)
    }
  },()=>{ //callback when finish loop
    console.log("finish findone() loop")
    defer.resolve(result)//return the result
  })
  return defer.promise
}

mainFunctio()

mainFunction() 基於 console.log 的結果

1.start mainFunction
2.start getData
3.finish find loop getData
4.finish mainFunction
5.final result : .....

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM