api服务器节点中的多个promise返回null

时间:2018-08-05 20:10:33

标签: node.js mongoose promise es6-promise

我的代码中的多个promise存在一些问题。无法返回到不在数据库中的项目。我多次更改了代码,但没有运气。它返回的唯一数据是“数据”:[         空值,         空值     ] 这是我的代码

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 个答案:

答案 0 :(得分:0)

我认为因为for循环是同步的,所以它不等待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,不知道它是否会立即生效,我只是向您提供了一个非常复杂的Promise链中的提示。如果它或它的任何变体有效,请更新此答案。

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
        });
    });
}