📜  如何防止 Promise 吞噬错误?

📅  最后修改于: 2022-05-13 01:56:15.697000             🧑  作者: Mango

如何防止 Promise 吞噬错误?

在本文中,我们将尝试了解如何使用 JavaScript 提供的几种预定义技术来防止 Promise 吞噬错误。

在深入探讨关注的主要主题之前,让我们快速了解如何使用以下语法声明 Promise。

句法:

let promise = new Promise((resolve, reject) => {
    ...
});

示例 1:以下代码片段将帮助我们更好地理解 Promise 声明:

Javascript
let promise = new Promise((resolve, reject) =>{
    resolve("Hello GeeksforGeeks")
});
 
promise.then(result => console.log(result));


Javascript
let promise = new Promise((resolve, reject) => {
    resolve();
});
promise
    .then(function () {
        console.log("GeeksforGeeks");
    })
    .then(function () {
        console.log("Hello ", someRandomText);
    });


Javascript
let promise = new Promise((resolve, reject) => {
    resolve();
})
 
promise
    .then(function () {
        console.log("GeeksforGeeks");
    })
    .then(function () {
        console.log("Hello ", someRandomText);
    }, function (error) {
        console.log("Promise rejected, error message : ", error);
    });


Javascript
let promise = new Promise((resolve, reject) => {
    resolve();
})
 
promise
    .then(() => {
        console.log("GeeksforGeeks");
    })
    .then(() => {
        console.log("Hello", someRandomText);
    })
    .catch((error) => {
        console.log("Promise rejected,
            error message : ", error);
    });


输出:

Hello GeeksforGeeks

现在让我们看看我们的问题陈述,我们必须用它来防止 Promise 吞噬错误。考虑以下代码片段(代码示例),其中说明了一个场景(基于实时工作),其中我们一个接一个地实现了 .then() 方法的链接。

现在,如果我们传入一些虽然没有在代码片段中任何地方声明的参数,那么我们的 Promise 将捕获错误(作为引用错误)并立即丢弃(或拒绝)该 Promise 并进一步导致代码崩溃。

示例 2:请参见下面的代码片段

Javascript

let promise = new Promise((resolve, reject) => {
    resolve();
});
promise
    .then(function () {
        console.log("GeeksforGeeks");
    })
    .then(function () {
        console.log("Hello ", someRandomText);
    });


输出:

现在,正如我们在上图的输出中看到的那样,错误被抛出,因此 promise 被拒绝,但我们可能不希望这种情况发生,所以我们的一种方法可能就像使用一个链接的处理函数就在从先前的 .then() 方法收到的错误之后。

示例 3:请参见下面的代码片段

Javascript

let promise = new Promise((resolve, reject) => {
    resolve();
})
 
promise
    .then(function () {
        console.log("GeeksforGeeks");
    })
    .then(function () {
        console.log("Hello ", someRandomText);
    }, function (error) {
        console.log("Promise rejected, error message : ", error);
    });

输出:

正如我们所见,这种方法(实现一个处理函数)似乎没有给我们正确的结果,因此我们可能不得不在收到错误后使用 .catch() 方法。

示例 4:请参见下面的代码片段

Javascript

let promise = new Promise((resolve, reject) => {
    resolve();
})
 
promise
    .then(() => {
        console.log("GeeksforGeeks");
    })
    .then(() => {
        console.log("Hello", someRandomText);
    })
    .catch((error) => {
        console.log("Promise rejected,
            error message : ", error);
    });

输出:

这种方法运行良好,不会拒绝我们声明要执行的承诺,相反,它实际上将承诺作为其状态并成功打印出错误消息而不会导致代码崩溃。

注意:我们可能已经成功地防止了 Promise 吞下错误(在上面的代码片段中),但我们不可能每次都将 .catch() 与每个有错误的 .then() 方法链接起来。因此,在处理一个项目时,我们首先必须安装Bluebird ,它是最受欢迎的 Promise 库之一,它有一个内置方法(名为 onRejection 处理程序)和另一个默认处理程序(称为 unhandledRejection),它帮助我们处理未处理的拒绝在完整的代码片段和这个代码片段上,我们必须立即实现它,并且在一次实现它之后,我们根本不需要担心未处理的异常。