首页 > 解决方案 > 初学者问题:(可选)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()

标签: javascriptlambdaes6-promise

解决方案


使用 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 的全部。我建议您阅读更多关于它们的信息,例如这篇文章


推荐阅读