【问题标题】:How return a value after a forEach loop using Promises?如何在使用 Promises 的 forEach 循环后返回一个值?
【发布时间】:2017-11-27 14:42:09
【问题描述】:

我需要知道如何使用 Promises 在 forEach 循环之后返回一个值。在这一刻,当我启动我的主程序时,我得到:

[ Promise { <pending> }, Promise { <pending> } ]

(我的 sampleidlist 只包含 2 条记录) 这是我的代码:

MongoClient.connect("mongodb://127.0.0.1/myproject", function(err, db) {
  return db.collection('RUN').find({
      "idRun": query.idRun
    }).toArray()
    .then((out) => {

      var sampleidlist = out[0].SAMPLE_ID
      var pazlist = []
      // Promisearr is the array of promises where I try to push the promises
      var Promisearr = []
      // there is the function find_paz that return idPaz for every sampleId in sampleidlist                        
      function find_paz(sampleid) {
        // I return a new Promise for every sampleId
        // I want to create an array of idPaz 
        return new Promise((resolve, reject) => {
          db.collection('PATIENTS').find({
              "SAMPLE_ID": sampleid
            }).toArray()
            .then((pazArr) => {
              var singlepaz = []
              singlepaz.push(pazArr[0].idPaz)
              return singlepaz
            })
            .then((singlepaz) => {
              pazlist.push(singlepaz)

            })
        })
      }
      // Here the forEach loop
      sampleidlist.forEach(sampleid => {
        Promisearr.push(
          find_paz(sampleid)
        )
      })
      Promise.resolve(Promisearr)
        .then(Promise.all(Promisearr))
        .then(value => {
          // value return {promise<pending>}
          // I want that value is the array of idPaz
          console.log(value)
        }).catch((err) => {
          console.log('errored', err);
        })

    }).catch((err) => {
      console.log('errored', err);
    })
})

有什么建议吗? 非常感谢:)

【问题讨论】:

标签: javascript mongodb foreach promise


【解决方案1】:

你把它混在了 Promise.all 和 Promise.resolve 之间。这里:

return db.collection('RUN').find({ “idRun”:查询.idRun }).toArray() .then((out) => {

  var sampleidlist = out[0].SAMPLE_ID
  var pazlist = []

  var Promisearr = []

  function find_paz(sampleid) {

      return db.collection('PATIENTS').find({
          "SAMPLE_ID": sampleid
        }).toArray()
        .then((pazArr) => {
          var singlepaz = []
          singlepaz.push(pazArr[0].idPaz)
          return singlepaz
        })
        .then((singlepaz) => {
          pazlist.push(singlepaz)
          return;
        })
    })
  }
  Promise.all(sampleidlist.map(find_paz))
    .then(values => {

      //values is an array with all the promises resolved
      //pazlist should have your data.
    }).catch((err) => {
      console.log('errored', err);
    })

}).catch((err) => {
  console.log('errored', err);
})

试一试,如果您需要澄清或者它不起作用,请告诉我。

【讨论】:

    【解决方案2】:

    您以错误的方式使用Promise.resolve()Promise.all()。你应该打电话给Promise.all() 然后.then(),像这样:

    Promise.all(Promisearr).then(value =>
        console.log(value)
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-30
      • 2020-01-18
      • 1970-01-01
      • 2023-03-10
      • 2020-05-06
      • 2019-10-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多