node.js - 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
所以……你知道我在做什么坏事吗?
解决方案
我不确定我是否理解了所有内容,但这是我关于这个反模式的新代码:```
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 调用。第一个承诺只是发回一个动作来执行调用者管理的操作。
推荐阅读
- javascript - 循环遍历对象的对象
- javascript - 如何使用“所有”集合以与 Gatsby.js 中的文件系统路由 API 一起使用?
- ruby - 带替换的 Ruby 字符串插值
- python - 使用 OpenCV 识别 7 段显示器上的数字
- c++ - 为什么在 srand 中使用“时间”?
- json - Flutter 中如何从这个 Json 中获取数据?
- wordpress - 如何让我的社交图标不变成蓝色?(来自超链接)
- javascript - 为什么这个合并排序实现不起作用?
- node.js - node.js 将后端和前端使用的 util 函数放在哪里
- google-visualization - 如何在烛台图前绘制折线图