拒绝Javascript承诺和错误处理

Steviebob

我正在尝试用正确的方法来表示正确的方法,以指示内发生故障.then()

如果诺言没有失败,(即返回诺言的操作是否可以正常工作,例如返回状态200的AJAX请求),但是我认为结果无效,通常我会这样做弹出窗口,向用户说明问题,然后执行“返回假”;尽早退出该方法。

但是,有了承诺,如果我想从.then()内部做类似的事情,我就被引导去相信我应该做的是抛出一个错误,而应该让它被.catch()抓住。 ),我已将其锁定。

我担心的是,我想区分承诺中成功但不满意结果的操作与承诺中失败的操作。

例如,如果我执行一个AJAX调用,但失败并显示404,那实际上是无法恢复的,因此似乎应该拒绝弹出窗口,说“出了点问题”。

但是,如果AJAX请求成功(返回状态200),但响应指示不正确(例如用户未使用正确的值填写字段),那么我想处理该问题某种方式,可能不仅涉及带有消息的弹出窗口(例如DOM操作,红色文本等,如果是404,我可能不想做的事情)。

以下是两个示例,可以更好地解释我的意思。

第一个是带有回调的原始实现,第二个是带有promise(将Ajax调用与Q promise库包装在一起,使其成为一个正确的promise)。

回调版本:

    $.ajax({
    url: "/cars/1",
    type: "GET",
    contentType: "application/json; charset=utf-8",
    dataType: "json"
})
.done(function (data) {
    if (!data.IsSuccessful) {
        //The request was successful (status 200), but the server is returning IsSuccessful=false
        alert(data.Message);//message says something like "we have that car in our catalogue but we don't have it in stock"
        return false;//early exit from .done()
    }

    //if it gets here, everything is good and I can do something with the result
})
.fail(function (data) {
    //The request actually failed due to a generic status 500 error which has something I don't necessarily want to expose in a popup to the user
    alert("Something went wrong");

});

承诺版本:

    var myPromise = Q(
    $.ajax({
        url: "/cars/1",
        type: "GET",
        contentType: "application/json; charset=utf-8",
        dataType: "json"
    })
);

myPromise.then(function (data) {
    if (!data.IsSuccessful) {
        throw new Error(data.Message);
    }

    //all good, lets do something with the result
})
.catch(function (error) {

    //what is error?
    //How do I know if it's one that I want to show to the user or not?

}).done();

在Promise版本中,如果请求返回404,它将.catch()立即结束吗?

如果data.IsSuccessful==false是的话,它也将最终以.catch()

如果我想以不同的方式对待这两种失败,我该怎么办呢?

我不在任何地方打电话来解决或拒绝,这有问题吗?

我想确保我尽可能遵循最佳实践。

贝吉

TL; DR:可以拒绝用于控制流,但通常,它们仅用于特殊情况


在Promise版本中,如果请求返回404,它将立即以.catch()结尾,对吗?

是的。

如果data.IsSuccessful == false,那么它也将以.catch()结尾吗?

是的。

我不在任何地方打电话来解决或拒绝,这有问题吗?

一点也不。您没有使用Promise构造函数(不需要,因为您已经有了对ajax结果的承诺)。

如果我想以不同的方式对待这两种失败,我该怎么办呢?

引发不同类型的错误,以便您可以区分它们。给它们命名,添加特殊属性,进行子类化(尤其是在ES6中),或仅查看消息。

承诺,如果从.then()内部,我想做类似的事情,我一直认为我应该做的是抛出一个错误,而不是

不必要。您可以做与不做承诺时完全相同的操作-在回调中添加if-else(如果愿意,可以在返回时返回if)。

就控制流及其结果值而言,

.then(function(res) {
    if (!res.isOK) {
        // do something
        return false;
    }
    // do something else
}).catch(function(err) {
    // handle something
})

.then(function(res) {
     if (!res.isOK)
         throw new MyError(res);
     // do something else
}).catch(function(err) {
     if (err instanceof MyError) {
         // do something
         return false;
     }
     // handle something
})

几乎是等效的(除了do something此throw之外MyError代码中的异常以及带有此类异常的代码除外)。主要区别在于何时要.then(…)then之间链接其他调用catch如果不这样做,请选择您更喜欢的东西。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

expressJS承诺和错误处理

来自分类Dev

处理Javascript承诺中的拒绝错误

来自分类Dev

错误处理参数和JavaScript承诺中的catch之间的区别

来自分类Dev

承诺错误处理基础

来自分类Dev

next()承诺错误处理

来自分类Dev

ExpressJS:承诺和错误处理中间件

来自分类Dev

Javascript:图像错误处理和嵌套

来自分类Dev

错误处理程序不要求承诺

来自分类Dev

错误处理和信号

来自分类Dev

JavaScript初始化和错误处理

来自分类Dev

JavaScript属性错误处理

来自分类Dev

未处理的承诺拒绝:模板解析错误:

来自分类Dev

javascript承诺未处理的拒绝问题

来自分类Dev

错误:未捕获(承诺中):未处理的承诺拒绝

来自分类Dev

Angularjs中的错误处理以实现延迟承诺

来自分类Dev

承诺中的 Node.js mysql 错误处理

来自分类Dev

Python错误处理和连接错误

来自分类Dev

Go方法链接和错误处理

来自分类Dev

Scala:错误处理和异常匹配

来自分类Dev

C检查NULL和错误处理

来自分类Dev

EJB,XA事务和错误处理

来自分类Dev

fgets和错误处理的小麻烦

来自分类Dev

bash:错误处理和功能

来自分类Dev

jQuery延迟的错误处理和恢复

来自分类Dev

Swift 2.2错误处理和音频

来自分类Dev

python asyncio和错误处理

来自分类Dev

跨域错误处理和WCF

来自分类Dev

JsonResult 和 ActionResult 的错误处理

来自分类Dev

Powershell 警告和错误处理