如何发送带有promise的对象数组

时间:2016-11-21 17:30:44

标签: javascript node.js express promise

我已经尝试了很多,并没有得到任何对我有用的东西。 我尝试使用promise.all并在全局范围内设置数组,但没有成功。

我想在MongoDB中搜索三个集合,当查找匹配时,使用infos设置一个对象并推送到一个数组。最后,使用对象数组发送响应。

router.post('/certificado', (req, res) => {
  let cpf = splita(req.body.cpf)
  let array = []

  function pesquisaProjeto(cpf) {
    return new Promise(function (fulfill, reject) {
      ProjetoSchema.find({'integrantes.cpf':cpf}, 'integrantes.$ nomeProjeto -_id',(err, usr) => {
        if (err) return reject(err)
        fulfill(usr)
      });
    })
  }

  function pesquisaAvaliador(cpf) {
    return new Promise(function (fulfill, reject) {
      avaliadorSchema.find({'cpf':cpf}, 'nome -_id',(err, usr) => {
        if (err) return reject(err)
        fulfill(usr)
      })
    })
  }

  function pesquisaParticipante(cpf) {
    return new Promise(function (fulfill, reject) {
      participanteSchema.find({'cpf':cpf}, 'nome eventos -_id', (err, usr) => {
        if (err) return reject(err)
        fulfill(usr)
      })
    })
  }

  pesquisaProjeto(cpf)
  .then(usr => {
    let participante = ({
      tipo: usr[0].integrantes[0].tipo,
      nome: usr[0].integrantes[0].nome
    })
    array.push(participante)
    console.log(participante)
  })
  .catch(err => console.log("Não encontrou nada nos projetos. " + err.message))

  pesquisaAvaliador(cpf)
  .then(usr => {
    let participante = {
      tipo: "Avaliador",
      nome: usr[0].nome
    }
    array.push(participante)
    console.log(array)
  })
  .catch(err => console.log("Não encontrou nada nos avaliadores. " + err.message))

  pesquisaParticipante(cpf)
  .then(usr => {
    let participante = ({
      tipo: "Participante",
      nome: usr[0].nome,
      eventos: usr[0].eventos
    })
    array.push(participante)
    console.log(array)
  })
  .catch(err => console.log("Não encontrou nada nos participantes dos eventos. " + err.message))

    **Anything like res.send(array) that I was tired to try**
});

对于这个愚蠢的怀疑感到抱歉,但我花了很多时间试图找到我决定诉诸社区的解决方案。

谢谢!

1 个答案:

答案 0 :(得分:1)

如果我理解你的问题,你有多个承诺,并希望等待所有这些承诺完成。您可以使用Promise.all()

执行此操作

如果一个Promise失败,Promise.all()也会失败。但是如果你像在你的例子中那样捕获它们而没有返回任何内容,我认为应该为该查询填充未定义的数组。因此,如果您愿意,可以将这些空值过滤掉。

const one = dbQueryOne.then(usr => ({
  key: usr.val
}))
.catch(err => { console.log(err) })

const two = dbQueryTwo.then(usr => ({
  key: usr.val
}))
.catch(err => { console.log(err) })

const three = dbQueryThree.then(usr => ({
  key: usr.val
}))
.catch(err => { console.log(err) })

Promise.all([one, two, three]).then(arr => {
  res.send(arr.filter(val => val !== undefined ))
})

usr => ({ key: val })只是usr => { return { key: val } }

的缩写