为什么我不能将Javascript Promise存储在变量中,然后调用“then”和“catch”方法?

时间:2017-12-25 10:09:49

标签: javascript asynchronous ecmascript-6 promise

  

我已经明白Promise是一个特殊的对象,其中javascript帮助我们处理异步任务并捕获由它引起的错误。

我熟悉以下用法:

func_returning_promise( )
.then((param)=>{do stuff with the param ; }
.catch((error) =>{console.log(error); }

我多么不喜欢像这样使用的.then和.catch,因此我将Promise存储在变量var myprom = func_returning_promise()中。

但是当我调用这样的“then”和“catch”方法时,根本没有处理错误,也没有执行catch处理程序。

var myprom = func_returning_promise();
myprom.then((param)=> do stuff with param ) ; 
myprom.catch((error)=> console.log(error)) ;

为什么我仍然会受到错误以及为什么捕获处理程序不执行?

它是否与semicolon ;方法末尾的then放置有关?

  

这不是问题Placement of catch before or after then

的重复      

我的问题不是关于当时的问题,而是提到所提到的问题。

2 个答案:

答案 0 :(得分:10)

您的第一个和第二个代码段并不相同。

在第一个中,.catch()将处理func_returning_promise()处理程序中.then() 中引发的任何错误。

在第二个问题中,.catch()被链接到原始承诺,因此只会 捕获func_returning_promise()中抛出的错误。

要实现与第一个示例相同而不进行链接,您必须将.then的结果分配给变量,并在 上调用catch

var myprom = func_returning_promise();

var mysecondprom = myprom.then((param)=> do stuff with param ) ; 

mysecondprom.catch((error)=> console.log(error)) ;

Promise被设计为链接。那么为什么不把它们连在一起呢?

答案 1 :(得分:2)

在您的第一个代码中,您将捕获func_returning_promise then回调中发生的错误中发生的错误。在第二个代码中,您只捕获myprom中的错误,忽略了当时链中抛出的错误。你可能会这样做:

 var myprom = func_returning_promise();
 myprom
  .then((param) => /*do stuff with param*/)
  .catch((error)=> console.log(error))