NodeJS вложенные обещания не работают должным образом - PullRequest
0 голосов
/ 12 марта 2020

У меня проблема с моим кодом. Он переходит ко второму разделу .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!

1 Ответ

0 голосов
/ 12 марта 2020

Хотя я не могу точно воспроизвести настройки, которые у вас есть выше, вот простой пример, который должен научить вас переписывать код, чтобы он работал так, как он должен.

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}`);
    });
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...