关于.catch(err)处理程序

时间:2019-09-04 16:27:37

标签: node.js

我想知道如何使用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)
})

3 个答案:

答案 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

引用 https://javascript.info/promise-chaining