我想知道如何使用catch语句。 我使用了如下代码那样的catch处理程序,如果err发生在B.find()中,我想知道err可以在A.catch()中进行处理 有两种代码样式,哪个更正确? 我认为A.catch包含B函数的错误,对吗? 如果正确,那么B.catch()是什么?
/////// code style 1 /////////////
A.find().then(res => {
//do something
B.find().then(res => {
//do something
}).catch(err => {
//catch err handle
res.send(err)
})
}).catch(err => {
//catch err handle
res.send(err)
})
//////// code style 2 //////////////////
A.find().then(res => {
//do something
B.find().then(res => {
//do something
})
}).catch(err => {
//catch err handle
res.send(err)
})
答案 0 :(得分:1)
总是返回在其他promise的处理程序中创建的promise,这将使您能够充分利用Promise
抽象。 Promise抽象是用于对异步任务进行排序并改善异步错误处理的工具。
您应该返回B.find()
,以便可以通过承诺链传播错误。
A.find().then(res => {
//do something
return B.find().then(res => {
//do something
})
}).catch(err => {
// handle error from A.find() or B.find()
res.send(err)
})
您还可以构建诺言链以避免深度嵌套的回调,通常称为“厄运金字塔”。
A.find().then(res => {
//do something
return B.find()
}).then(res => {
// do something with B.find() result
}).catch(err => {
// handle error from A.find() or B.find()
res.send(err)
})
如果您使用async/await
语法,则可能有助于了解Promises如何使您以同步方式考虑异步编程,这通常使开发人员更容易理解。
try {
const a = await A.find();
const b = await B.find();
} catch (err) {
// handle error from A.find() or B.find()
res.send(err);
}
答案 1 :(得分:0)
仅当您在chaining pattern中返回A
时,外部B
才能处理内部B
的错误
否则,您将在UnhandledPromiseRejection
中获得nodejs
(或在浏览器中获得uncaught exception
,仅在Firefox上经过验证)
这是一个例子:
getPromise
的拒绝在这里由anotherP
的{{1}}处理,因为承诺是catch
returned
(打开浏览器控制台以查看function getPromise() {
return Promise.reject('reject');
}
function anotherP() {
return Promise.resolve('resolve');
}
anotherP()
.then(d => {
console.log(d)
return getPromise()
})
.catch(e => console.log(e))
)
在这里您看不到uncaught exception
消息,因为外面的reject
的{{1}}不能捕获anotherP
的拒绝。可以将这两个诺言视为在未来的不同背景下运行,因此对一个诺言的拒绝不在另一个诺言的范围内
catch
答案 2 :(得分:0)
根据标准编码惯例,应使用Promise链接。因此,您将有一个catch块来跟踪所有错误。
npm uninstall webpack --save
npm install webpack@4.0.0 --save
npm install webpack-cli -D