我已经明白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
的重复我的问题不是关于当时的问题,而是提到所提到的问题。
答案 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))