坚持将 Node/Mongo 代码从回调函数重构为 Promises
Stuck on refactoring Node/Mongo code from callback functions to Promises
我在node.js写了一个项目,其中异步是通过回调函数实现的。但是,我后来了解了 Promises 和 async/await。重构项目代码以便我将所有回调函数替换为 async/await 是否是最佳实践?
无论如何,作为对自己的训练,我决定先重构 Promises,然后再重构 async/await。但是,我对重构承诺有一些疑问。
现在,下面的示例并没有真正包含太多 'callback hell' 的内容,因此您可能认为重构 promises 并不是真正必要的,但我故意从一个直接的示例开始。我代码的其他部分确实包含回调地狱。
所以这里是我的一个项目中使用的回调函数的例子。当用户选择他们的一篇博文并单击 'delete' 时,将运行以下代码(BlogPost 是数据库集合)
app.post('/users/login', =(req, res)=>{
BlogPost.findByIdAndDelete(req.body.idOfPostToBeDeleted, (err, blogpost)=>{
res.redirect('/');
console.log(err, blogpost)
});
});
到目前为止,我是这样重构的。
app.post('/users/login', (req,res)=>{
BlogPost
.findByIdAndDelete(req.body.idOfPostToBeDeleted)
.then(
()=>{res.redirect('/')})
.catch((error)=>{console.log(error)})
;
}
它似乎按预期工作,但我觉得我没有正确完成,主要是因为我没有创建 Promise 构造函数。所有关于此的教程都包括承诺构造函数
为什么这在没有 promise 构造函数的情况下工作?
如果 'then' 关键字没有 promise 构造函数会怎样?
这里的最佳做法是什么?
我应该创建一个 promise 构造函数吗?看起来究竟是什么样的代码?
我认为 findByIdAndDelete 足够智能,可以 return 如果您不指定回调,则可以使用 Promise。
这就是为什么您不需要构建 Promise。我觉得你的做法还可以。
为了提高可读性,大多数人更愿意使用 async await 编写此代码:
app.post('/users/login', (req,res)=> {
async (req,res)=>{
try{
const result = await BlogPost.findByIdAndDelete(req.body.idOfPostToBeDeleted)
res.redirect('/')
} catch(e)
{
console.log(error)
}
}
}
我在node.js写了一个项目,其中异步是通过回调函数实现的。但是,我后来了解了 Promises 和 async/await。重构项目代码以便我将所有回调函数替换为 async/await 是否是最佳实践?
无论如何,作为对自己的训练,我决定先重构 Promises,然后再重构 async/await。但是,我对重构承诺有一些疑问。
现在,下面的示例并没有真正包含太多 'callback hell' 的内容,因此您可能认为重构 promises 并不是真正必要的,但我故意从一个直接的示例开始。我代码的其他部分确实包含回调地狱。
所以这里是我的一个项目中使用的回调函数的例子。当用户选择他们的一篇博文并单击 'delete' 时,将运行以下代码(BlogPost 是数据库集合)
app.post('/users/login', =(req, res)=>{
BlogPost.findByIdAndDelete(req.body.idOfPostToBeDeleted, (err, blogpost)=>{
res.redirect('/');
console.log(err, blogpost)
});
});
到目前为止,我是这样重构的。
app.post('/users/login', (req,res)=>{
BlogPost
.findByIdAndDelete(req.body.idOfPostToBeDeleted)
.then(
()=>{res.redirect('/')})
.catch((error)=>{console.log(error)})
;
}
它似乎按预期工作,但我觉得我没有正确完成,主要是因为我没有创建 Promise 构造函数。所有关于此的教程都包括承诺构造函数
为什么这在没有 promise 构造函数的情况下工作?
如果 'then' 关键字没有 promise 构造函数会怎样?
这里的最佳做法是什么?
我应该创建一个 promise 构造函数吗?看起来究竟是什么样的代码?
我认为 findByIdAndDelete 足够智能,可以 return 如果您不指定回调,则可以使用 Promise。
这就是为什么您不需要构建 Promise。我觉得你的做法还可以。
为了提高可读性,大多数人更愿意使用 async await 编写此代码:
app.post('/users/login', (req,res)=> {
async (req,res)=>{
try{
const result = await BlogPost.findByIdAndDelete(req.body.idOfPostToBeDeleted)
res.redirect('/')
} catch(e)
{
console.log(error)
}
}
}