【问题标题】:NodeJS nested promises not working properlyNodeJS 嵌套的 Promise 无法正常工作
【发布时间】:2020-03-17 07:05:16
【问题描述】:

我的代码有问题。它在没有完成第一份工作的情况下跳转到第二个.then 部分。之后,它会回到第一个承诺,但永远不会在第二个 .then 内执行代码

Promise.all(jobs).then((values) => {
    console.log("First!")
    values.forEach(function(vals) {
        vals.forEach(function(doc) {
            if (doc.properties.location_i.toString() == request.body.id) {
                jobs_do.push(dbo.collection("zones").find({
                    "geometry": {
                        $geoIntersects: {
                            $geometry: {
                                type: "Point",
                                coordinates: [
                                  docs[values.indexOf(vals)].geometry_do.coordinates[0],
                                  docs[values.indexOf(vals)].geometry_do.coordinates[1]
                                ]
                            }
                        }
                    }
                }))
            }
        })
    })

}).then(function() {
    console.log("Second!")
    Promise.all(jobs_do).then((values) => {
        values.forEach(function(vals) {
            vals.forEach(function(doc) {
                console.log(doc.properties.objectid);
            });
        })
    });

});

它满足jobs_do数组但Promise.all(jobs_do).then((values))jobs_do为空时执行一次。

控制台日志是:

First!
Second!

【问题讨论】:

  • 所以你说jobs_do 在第二个then 是空的?

标签: node.js mongodb promise


【解决方案1】:

虽然我无法完全复制您上面的设置,但这里有一个简单的示例,可以指导您如何重新编写代码,使其按预期工作。

const jobs = Array.from({ length: 2 })
  .map((_, idx) => {
    return Promise.resolve({
      id: idx + 1,
      title: `Job ${idx + 1}`
    })
  })
const jobs_do = [];
  
Promise.all(jobs)
  .then(values => {
    console.log("first!");

    for (const value of values) {
      if (true) {
        jobs_do.push(
          Promise.resolve({
            ...value,
            description: `This is a description for job ${value.id}`
          })
        );
      }
    }
    return Promise.all(jobs_do);
  })
  .then(results => {
    console.log("second!");

    results.forEach(result => {
      console.log(`[${result.id}] | ${result.title} | ${result.description}`);
    });
  });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 2021-02-20
    • 2023-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多