NodeJS Promise тогда не выполняется - PullRequest
0 голосов
/ 29 августа 2018

Мне нужна помощь. Это моя первая попытка с обещаниями. Вот мой код для обещания:

const deleteUniversRefInTarget = (universName, targetName) => {
  console.log('Appel de deleteUniversRefInTarget')
  const promis = new Promise((resolve, reject) => {
    Target.findOneAndUpdate({ univers: universName, name: targetName },
      (err, target) => {
        console.log('Entrée dans la promesse')
        if (err) {
          reject(err)
        } else {
          if (target === null) {
            reject(TypeError(`Invalid univers'n name ${universName}`))
          } else {  
            if (target.univers.length === 1) {
              resolve('deleteTarget')
            } else {
              target.univers.splice(target.univers.indexOf(universName), 1)
              resolve('dereferencedUnivers')
            }
          }
        }
      })
  })
  return promis
}

Я называю это обещание здесь:

exports.deleteATarget = (req, res) => {
  deleteUniversRefInTarget(req.params.universName, req.params.targetName)
    .then((response) => {
      console.log('Fin du traitement de la promesse')
      if (response === 'deleteTarget') {
        Target.findOneAndDelete({ name: req.params.targetName, univers: req.params.universName },
          (err, target) => {
            if (err) {
              res.send(err)
            }
            res.json({ message: `Target ${target.name} isn't used in any univers, so we deleted it` })
          })
      } else {
        res.json({ message: `Target ${req.params.targetName} no longer used in ${req.params.universName} univers` })
      }
    })
    .catch((error) => {
      res.send(error)
    })
}

В консоли я вижу: Appel de deleteUniversRefInTarget Но не Fin du traitement de la promesse

Итак ... ты знаешь, что я делаю плохо?

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

Я не уверен, что все понял, но вот мой новый код об этом анти-паттерне: `` `

const deleteTargetOrDerefUniversInTarget = (universName, targetName) => {
  const promis = new Promise((resolve, reject) => {
    Target.findOne({ name: targetName, univers: universName })
      .then((target) => {
        if (target === null) {
          reject(TypeError(`Invalid univers'n name ${universName} or target's name ${targetName}`))
        } else if (target.univers.length === 1) {
          resolve({ action: 'deleteTarget', target })
        } else {
          resolve({ action: 'dereferencedUnivers', target })
        }
      })
      .catch((err) => {
        reject(err)
      })
  })
  return promis
}

exports.deleteATarget = (req, res) => {
  deleteTargetOrDerefUniversInTarget(req.params.universName, req.params.targetName)
    .then((response) => {
      if (response.action === 'deleteTarget') {
        Target.findOneAndDelete({ name: response.target.name, univers: req.params.universName })
          .then((target) => {
            res.json({ message: `Target ${target.name} isn't used in any univers, so we deleted it` })
          })
          .catch((err) => {
            res.status(err.status).json(err)
          })
      } else {
        response.target.univers.splice(response.target.univers.indexOf(req.params.universName), 1)
        response.target.save()
        res.json({ message: `Target ${response.target.name} no longer used in ${req.params.universName} univers` })
      }
    })
    .catch((error) => {
      res.send(error)
    })
}

`` ` В этом новом коде больше нет вызова exec. Первое обещание просто отправить обратно действие, чтобы выполнить управление вызывающим абонентом.

0 голосов
/ 29 августа 2018

Хорошо, звучит намного лучше, когда я преобразовываю свой запрос мангусты (findOneAndUpdate) в обещание: `

const deleteUniversRefInTarget = (universName, targetName) => {
  console.log('Appel de deleteUniversRefInTarget')
  const promis = new Promise((resolve, reject) => {
    Target.findOneAndUpdate({ univers: universName, name: targetName })
      .exec()
      .then((target) =>{
        console.log('Entrée dans la promesse')
        if (target === null) {
          reject(TypeError(`Invalid univers'n name ${universName}`))
        } else {  
          if (target.univers.length === 1) {
            resolve('deleteTarget')
          } else {
            target.univers.splice(target.univers.indexOf(universName), 1)
            resolve('dereferencedUnivers')
          }
        }
      })
      .catch((err) => {
        reject(err)
      })
  })
  return promis
}

`

И разница в основном в части .exec (). Я думаю, мы можем сказать, что это решает ... даже если я не уверен, что это правильный способ сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...