使用q.js时出现意外输出

时间:2016-09-02 15:17:41

标签: javascript exception-handling q

我有以下代码:

        var p1 = Q($.ajax({
            url: "/api/test1"
        }));

        p1.then(function () {
            console.log("success1");
        });

        p1.then(function () {
            throw "some error";
            console.log("success2");
        });

        p1.then(function () {
            console.log("success3");
        });

        p1.catch(function () {
            console.log("failure1");
        });
        p1.catch(function () {
            console.log("failure2");
        });

        p1.finally(function () {
            console.log("finally1");
        });
        p1.finally(function () {
            console.log("finally2");
        });

我期待以下输出假设我从api / test1获得一些数据 - " success1,failure1,failure2,finally1,finally2"

我真正得到的是 " success1,success3,finally1,finally3"

" Success3"令我感到困惑的是 - 为什么代码会在发生异常时传播到第二个?

我如何编写此代码以便能够捕获当时部分中可能出现的任何异常?

TA

1 个答案:

答案 0 :(得分:0)

“Success3”显示的原因是因为你的承诺没有被束缚 基本上,“然后”调用(以及“捕获”和“最终”)是彼此相互依赖的。如果您将其视为树结构,则它们都是p1承诺的子项。如果你想让他们依赖,他们就会有一个孩子,孙子,曾孙等关系。如果你想把它们连在一起,你可以做类似的事情:

    var p1 = Q($.ajax({
        url: "/api/test1"
    }));

    p1.then(function () {
        console.log("success1");
    }).then(function() {
        throw "some error";
        console.log("success2");
    }).catch(function () {
        console.log("failure");
    });

在每个函数运行后,这基本上是隐式返回promise。随后的“then”(或catch / finally)将应用于该(隐式)返回值。