首页 > 解决方案 > NodeJS Promise 然后没有执行

问题描述

我需要一些帮助。这是我第一次尝试承诺。这是我的承诺代码:

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

所以……你知道我在做什么坏事吗?

标签: node.jspromise

解决方案


我不确定我是否理解了所有内容,但这是我关于这个反模式的新代码:```

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 调用。第一个承诺只是发回一个动作来执行调用者管理的操作。


推荐阅读