Несколько обещаний в узле сервера API возвращает ноль

У меня есть некоторые проблемы с несколькими обещаниями в моем коде. Невозможно вернуться к элементам, которых нет в базе данных. Я несколько раз менял код, но не повезло. Единственные данные, которые он возвращает, это "datas": [ null, null ] Это мой код

var start = function(offset, entry) {
  return new Promise(function(resolve, reject) {
    rp('************' + entry).then(function(repos) {
      resolve(repos);
    }).catch(function(err) {
      reject(err);
    });
  });
};

var findnewones = function(iten) {
  return new Promise(function(resolve, reject) {
    return Promise.all(iten.items.map(function(ndtrcitem) {
      return new Promise(function(resolve, reject) {
         Items.findOne({"metadata.trcid": ndtrcitem.metadata.trcid}).exec(function(err, doc) {
          if (!doc) {
            resolve(ndtrcitem);
          }
        });
      })
    })).then(datas => {
      resolve(datas);
    });
  })
}


exports.find = function(req, res, next) {
  var ndite = ["locations", "events"];
  var items = [];
  return Promise.all(ndite.map(function(entry) {
    return start(0, entry).then(function(res) {
      for (i = 0; i <= res.count; i += 10) {
        return start(i, entry).then(function(iten) {
          findnewones(iten).then(function(dat) {
            items.push(dat);
          });
        });
      }
      return items;
    })
  })).then(datas => {
    res.json({datas});
  });
}

1 ответ

Я думаю, потому что цикл там синхронный, и он не ждет start() обещаю решить.

for (i = 0; i <= res.count; i += 10) {
    return start(i, entry).then(function(iten) {
      findnewones(iten).then(function(dat) {
        items.push(dat);
      });
    });
  }

Я заменил его async/awaitНе знаю, сработает ли это сразу, я просто даю подсказку в этой очень сложной цепочке обещаний. Если это или какой-либо вариант работает, пожалуйста, обновите этот ответ.

exports.find = function (req, res, next) {
    var ndite = ["locations", "events"];
    var items = [];
    return Promise.all(ndite.map(function (entry) {
        return start(0, entry)
        .then(async function (res) {////// this
            for (i = 0; i <= res.count; i += 10) {
                await start(i, entry).then(function (iten) { ////this
                    findnewones(iten).then(function (dat) {
                        items.push(dat);
                    });
                });
            }
            return items;
        })
    })).then(datas => {
        res.json({
            datas
        });
    });
}
Другие вопросы по тегам