javascript - 初学者问题:(可选)promise 结合箭头/访问结果/错误值
问题描述
这是一个使用 mongoose 为我的 mongoDB 创建对象的简单函数:
Item.create({ name: req.body.newItem }, function (err, res) {
if (err) return handleError(err);
// saved!
});
现在,我正在学习承诺的概念。由于create API返回一个可选的 Promise,我想使用它,用于学习目的和可读性。
我这样做的方式是这样的:
let newItem = Item.create(
{name: req.body.newItem}).then(() => console.log("Success"), () => console.log("Error!"));
这确实有效。但我在这里欺骗自己。我真正想要的是拥有与上面相同的代码,这意味着使用(err, small)
并将其合并到我的.then()
.
我知道每个承诺都有一个已解决或已拒绝的状态,并且可以使用这些状态。我不明白如何在这里执行此操作的概念,因为.then((resolve, reject)
不允许
编辑:
我刚试过这个:
let newItem = Item.create(
{name: req.body.newItem}).then(result => console.log("Success: " + result), (error) => console.log("Error: " + error));
这似乎工作。我想我当时还没有完全掌握箭头的概念。我认为相当于
function(a, b){
if(a){
do Something()
}else{ //so it has to be b
do otherThing()
}
将会.then(a,b) => doSomething(),do otherThing()
解决方案
使用 Promises 时,您(不仅)有两种方法,在大多数情况下,这两种方法都是您所需要的:
then()
- 当 Promise 解决时接收回调函数,当 Promise 拒绝时接收回调函数。如果你省略了第二个回调并且 Promise 被拒绝,一个错误将被重新抛出,需要进一步处理catch()
- 当 Promise 拒绝时接收回调函数
在您的情况下,.create()
Promise 可能会被履行或被拒绝(这些并不是 Promise 可以拥有的所有状态)。要处理这两种情况,您可以像这样链接.then()
和.catch()
:
Item.create({name: req.body.newItem })
.then((result) => {
console.log('resolved', result);
})
.catch((error) => {
handleError(error);
})
或像这样:
Item.create({name: req.body.newItem })
.then(
(result) => {
console.log('resolved', result);
},
(error) => {
handleError(error);
}
);
两种方法是等效的。
通常,Promises 处理如下所示:
somethingReturnsPromise()
.then((result) => {
// handle result
})
.catch((error) => {
// handle error
});
但这并不是关于 Promise 的全部。我建议您阅读更多关于它们的信息,例如这篇文章。
推荐阅读
- python - How to repeat the body of a with-statement in Python?
- excel - 我想为在 Excel 中选择各种选项时创建一个成本计算表
- mysql - 我应该使用什么 SQL 查询从数据库中获取信息?
- flutter - 包装按钮的内容宽度而不是固定宽度
- tensorflow - How to use Variational Autoencoder as a Feature Extractor?
- ajax - 在 Asp.net core 2.1 上使用 Boostrap Modal 上传文件
- sql - Oracle SQL - 无效的 Alter Table 选项
- sql - MS SQL (SAP B1) “当子查询没有用 EXISTS 引入时,只能在选择列表中指定一个表达式...”
- ansible - 即使在使用本地连接运行 playbook 时将 delegate_to 设置为 remote,Ansible 也会在控制机器中创建目录
- c++ - objc 运行时源代码中类 ExplicitInit 的用途