我发现了一个教程下面的代码:重新抛出错误
promise.then(function(result){
//some code
}).catch(function(error) {
throw(error);
});
我有点困惑:不渔获调用就可以完成什么?在我看来,它没有任何效果,因为它只是抛出了被捕获的相同错误。我的基础是如何定期尝试/捕捉工作。
我发现了一个教程下面的代码:重新抛出错误
promise.then(function(result){
//some code
}).catch(function(error) {
throw(error);
});
我有点困惑:不渔获调用就可以完成什么?在我看来,它没有任何效果,因为它只是抛出了被捕获的相同错误。我的基础是如何定期尝试/捕捉工作。
没有任何意义的裸体抓住和抛出,因为你展示。除了添加代码和执行速度慢之外,它没有任何用处。所以,如果你打算.catch()
并重新抛出,应该有你想要做的.catch()
,否则你应该完全删除.catch()
。
该通用结构的通常点是当你想要执行.catch()
中的某些内容时,例如记录错误或清除某些状态(如关闭文件),但希望承诺链继续被拒绝。
promise.then(function(result){
//some code
}).catch(function(error) {
// log and rethrow
console.log(error);
throw error;
});
在教程中,可以在那里只是为了显示人们在那里他们可以赶上错误或教的处理错误,然后重新抛出它的概念。
所以这听起来像你的问题是'在承诺链中,.catch()方法有什么作用?
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/throw
throw语句“将停止(抛后的报表将不会被执行),并且控制将被传递到调用堆栈中的第一个catch块。如果没有catch块调用函数中存在该程序将终止。“
在承诺链中,.then()方法将返回某种类型的数据块。块的这种返回将完成承诺。数据的成功返回完成了承诺。您可以用相同的方式考虑.catch()方法。 .catch()将处理不成功的数据检索。 throw语句完成了这个承诺。在开始的时候,你会看到开发者使用.catch((err)=> {console.log(err))}这也会完成承诺链。
如果完全忽略catch
方法调用,没有什么重要区别。
它唯一添加的是一个额外的微任务,在实践中意味着你会注意到承诺迟于没有catch
条款的情况下承诺的情况。
下一个片段演示了这一点:
var p;
// Case 1: with catch
p = Promise.reject('my error 1')
.catch(function(error) {
throw(error);
});
p.catch(error => console.log(error));
// Case 2: without catch
p = Promise.reject('my error 2');
p.catch(error => console.log(error));
注二等排斥反应如何前首次报道。这是唯一的区别。
snippet正常工作。但是,该服务现在不可用..检查:http://meta.stackoverflow.com/a/337257/747579 –
.then()
和.catch()
方法返回Promises,并且如果在任一处理程序中抛出Exception,则返回的promise将被拒绝,并且Exception将在下一个拒绝处理程序中被捕获。
在下面的代码中,我们扔在第一.catch()
一个例外,它被捕获在第二.catch()
:
new Promise((resolve, reject) => {
console.log('Initial');
resolve();
})
.then(() => {
throw new Error('Something failed');
console.log('Do this'); // Never reached
})
.catch(() => {
console.log('Something failed');
throw new Error('Something failed again');
})
.catch((error) => {
console.log('Final error : ', error.message);
});
第二.catch()
返回一个承诺成立时, .then()
处理程序可称为:
new Promise((resolve, reject) => {
console.log('Initial');
resolve();
})
.then(() => {
throw new Error('Something failed');
console.log('Do this'); // Never reached
})
.catch(() => {
console.log('Something failed');
throw new Error('Something failed again');
})
.catch((error) => {
console.log('Final error : ', error.message);
})
.then(() => {
console.log('Show this message whatever happened before');
});
有用的参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises#Chaining_after_a_catch
希望这有助于!
你能提供一个指南的链接吗?也许有额外的上下文,这将有所帮助... – Igor
@Igor我不能,它在Pluralsight上。这可能只是一些错误处理逻辑的占位符? –
这就是我所猜测的,因为它什么也没有做,然后将错误传递给调用者,这也可以通过没有捕获来开始。 – Igor