没有$ q的等价的$ q.deferred.reject

时间:2016-09-07 06:45:46

标签: angularjs promise angular-promise

我想这必须是一个非常正常的设置:

return $http.get('some/url')
.then(function (result) {
    if (result.data.success) {
        //Do something useful
    } else {
        //We've hit some sort of error
    }
},
function () {
    return "Failed to communicate with the server, or the server encountered an error.";
});

我的问题是如何处理http调用在技术上成功的情况,但我们从服务器返回的数据是错误的,不可用的,或明确指出出错了。我想做的就是把自己推到承诺链的失败轨道上。这样,任何使用此承诺的人都可以执行自己的失败功能,如果这是有道理的。

我知道$ q为您提供了创建延迟对象所需的工具,然后让您在任何情况下调用resolve或reject,但我想知道是否有办法在不使用$ q的情况下执行此操作

2 个答案:

答案 0 :(得分:2)

要将承诺从已解决状态更改为已拒绝状态,您可以从.then()处理程序执行以下两项操作之一:

  1. 返回被拒绝的承诺,拒绝承诺的理由将成为父承诺的拒绝理由。
  2. 抛出异常,异常值将成为父承诺的拒绝原因。 .then()会自动捕获.then()处理程序函数中的异常并将其转为拒绝。
  3. 所以,这是你可以做到的一种方式:

    return $http.get('some/url').then(function (result) {
        if (result.data.success) {
            //Do something useful
        } else {
            //We've hit some sort of error, make promise become rejected
            throw new Error("invalid data received");
        }
    }).catch(function (err) {
        // log error
        console.log(err);
        // make sure promise stays rejected
        throw err;
    });
    

答案 1 :(得分:0)

如果您使用ES6,则可以使用JavaScript本机承诺。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise