我正在努力理解mongoose的async、await和promises

7y4bm7vi  于 2023-08-06  发布在  Go
关注(0)|答案(1)|浏览(106)

下面的代码运行在app.js服务器上:

async function getNewNodesArray(level, nID, pdbID) {
    let newNodesArray = [];
    const dbNodes = await partsAssemblyModel.find({ParentID:pdbID}).exec();
    dbNodes.map(async(dbN) => {
        const dbChildren = partsAssemblyModel.find({ParentID:dbN.id}).exec();
        nID++;
        //newNode = {id:nID, dbId:dbN.id, name:dbN.Description, isParent:true}
        newNode = {id:nID, name:dbN.Description, isParent:(dbChildren.length > 0)}
        newNodesArray.push(newNode);
      })
    return newNodesArray;
}

字符串
异步函数getNewNodesArray从express post函数调用

app.post("/getTreeNodes", async (req, res) => {
    ...
    ...
    ...
    var ppp = await getNewNodesArray(pLevel, pId, pdbID);
    res.send(ppp);
});


我尝试获取所有partsAssemblyModel文档,这些文档具有通过id-ParentID关系链接到它的partsAssemblyModel文档。实际上,代码按预期执行,除了dbNodes对象是查询的结果,但dbChildren仍然是一个promise,正如预期的那样,没有await。
如果我将await添加到dbChildren赋值中,如下所示:

const dbChildren = await partsAssemblyModel.find({ParentID:dbN.id}).exec();


这一行被执行了Map调用它的次数,并且下一行执行返回到app.post的res.send(ppp);只有在app.post函数完成执行后,执行才会返回到nID++。
我的问题是,为什么代码不在下一行继续执行:

const dbChildren = await partsAssemblyModel.find({ParentID:dbN.id}).exec(); as it does in the line
const dbNodes = await partsAssemblyModel.find({ParentID:pdbID}).exec();


任何有助于理解原因的帮助都是值得赞赏的,解决问题的方法将有很大帮助。
谢啦,谢啦

thigvfpy

thigvfpy1#

我找到了一个解决问题的方法,将map替换为一个简单的for语句:

async function getNewNodesArray(level, nID, pdbID) {
  let newNodesArray = [];
  const myCount = await partsAssemblyModel.count();
  if (myCount === 0 ){return newNodesArray};
  const dbNodes = await partsAssemblyModel.find({ ParentID: pdbID }).exec();
  for ( var i = 0; i< dbNodes.length; i++){
    let dbChild = await partsAssemblyModel.findOne({ ParentID: dbNodes[i].id }).exec();
    console.log(typeof dbChildren);
    nID++;
    newNode = {id:nID, dbId:dbNodes[i].id, name:dbNodes[i].Description, isParent:(dbChild !== null)}
    //newNode = { id: nID, name: dbN.Description, isParent: (dbChildren.length > 0) }
    newNodesArray.push(newNode);
  }
  return newNodesArray;
}

字符串
但我还是不明白为什么Map不起作用。

相关问题