我正在执行一个递归循环来从MongoDB获取数据,但是在数据可以被发送回之前,js.js函数执行整个脚本

s6fujrry  于 2023-10-16  发布在  Go
关注(0)|答案(1)|浏览(73)

我想知道如何设置Express路由,以便在使用promise调用递归函数并获取MongoDB数据时将数据返回给客户端。现在的情况是,我的路由立即执行,数据永远不会被发送回客户端。数据确实会进来,但在数据发送之后才进来。下面是我正在使用的代码:

const fetchTrees = (source, root) => {
        return new Promise((resolve, reject) => {
            User.find({referrer: source}).then((response) => {
                for (person in response) {
                    const document = response[person]._id
                    root[document] = {
                        name: response[person].first_name + ' ' + response[person].last_name,
                        uppLine: response[person].uppLine,
                        _id: response[person]._id
                    }
                    const descendants = fetchTrees(document, root[document])
                    root[document].descendants = descendants
                }
            })
            console.log("Hey", root)
            if (root._id !== null || root._id !== undefined) {
                resolve(root)
            } else {
                reject("No tree data")
            }
        })
    }
    
    fetchTrees(source, root).then((result) => {
        console.log("Returnnn",result)
        if (result) {
            return res.status(200).send(result)
        } else {
            return res.status(404).send("No tree found")
        }
    })

“Hey”和“Returnnn”在数据输入之前就出现了:

Hey {}
Returnnn {}
qnakjoqk

qnakjoqk1#

如果您等待这个递归的递归编译操作,这将有所帮助。您可以使用“Promise.all”函数等待操作完成,而不是立即获得内部promise结果。
代替for循环;

const promises = response.map((person) => {
   const document = person._id;
   root[document] = {
      name: person.first_name + ' ' + person.last_name,
      uppLine: person.uppLine,
      _id: person._id,
   };
   return fetchTrees(document, root[document]);
});

你可以使用这些承诺;

Promise.all(promises)
   .then((results) => {
      root[document].descendants = results;
      console.log("Hey", root);
      if (root._id !== null || root._id !== undefined) {
         resolve(root);
      } else {
         reject("No tree data");
      }
   })
   .catch((error) => {
      reject(error);
});

相关问题