初学者问题:(可选)承诺与箭头结合使用/访问结果/错误值

这是一个使用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()

lxxlwj 回答:初学者问题:(可选)承诺与箭头结合使用/访问结果/错误值

在使用Promises时,您(不仅)有两种在大多数情况下只需要的方法:

  • then()-在Promise解析时接收回调函数,而在Promise拒绝时接收回调函数。如果您省略第二个回调而Promise拒绝,则错误将被重新抛出并需要进一步处理
  • catch()-当Promise拒绝时,它将接收回调函数

在您的情况下,.create()承诺可能会实现或被拒绝(并非承诺所能拥有的所有状态)。要处理这两种情况,您可以像这样链接.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
    });

但是,这不仅仅与承诺有关。我建议您阅读有关它们的更多信息,例如this article

,

其他答案极大地描述了诺言如何工作。但是,如果您需要这样做:

  

我真正想要的是具有与上面相同的代码,这意味着使用(err,small)并将其合并到我的.then()

您可以简单地从promise中调用带有空err参数的函数:

const existingFunction = (err,small) => { /* Do stuff */ }

Item.create({name: req.body.newItem })
  .then(newItem => {
    existingFunction(null,newItem)
  })
  .catch(err => {
     existingFunction(err)
  })
本文链接:https://www.f2er.com/3037835.html

大家都在问