AngularJS 资源 GET 请求失败

29

有人知道如何在AngularJS中检查未获取到资源吗?

例如:

//this is valid syntax
$scope.word = Word.get({ id : $routeParams.id },function() {
    //this is valid, but won't be fired if the HTTP response is 404 or any other http-error code
});

//this is something along the lines of what I want to have 
//(NOTE THAT THIS IS INVALID AND DOESN'T EXIST)
$scope.word = Word.get({ id : $routeParams.id },{
    success : function() {
      //good
    },
    failure : function() {
      //404 or bad
    }
});

有什么想法吗?
3个回答

49

当出现错误时,你的第一个回调函数之后应该有一个额外的回调函数触发。引用自文档帖子

$scope.word = Word.get({ id : $routeParams.id }, function() {
    //good code
}, function(response) {
    //404 or bad
    if(response.status === 404) {
    }
});
  • 对于 HTTP GET 请求的“类”操作:Resource.action([参数], [成功回调函数], [错误回调函数])
  • 对于非 GET 请求的“类”操作:Resource.action([参数], postData, [成功回调函数], [错误回调函数])
  • 对于非 GET 请求的实例操作:instance.$action([参数], [成功回调函数], [错误回调函数])

1
问题出在if语句中。我需要写if(reponse.status == 404 ) ,if(reponse.status == 500 ), if(reponse.status == 501 ) , if .. if .. if 吗?这不是代码重复吗? - Adelin
1
@Adio 你可以使用 switch 语句。 - Ian Hunter
1
@gloopy,我知道有文档,但我找不到关于传递给成功和错误回调的输入参数的规范。比如,我怎么知道错误的第一个参数是“response”?你知道它们在哪里被描述吗?(除了断点和检查之外) - superjos
1
@superjos 我找不到文档,但是在查看 ngResource 代码 后,看起来在错误情况下,错误函数会得到 $http promise 响应对象,该对象具有数据、状态、标头和配置等属性,如此处所定义。错误的第二个参数未被使用,我已经编辑了答案!希望这可以帮助你。 - Gloopy
感谢您的进一步研究。我再次查阅了文档,并在示例下方发现: “值得注意的是,get、query和其他方法的成功回调函数不仅会传递来自服务器的响应,还会传递$http头部获取函数,因此可以…” - superjos
这样我需要在每次从控制器调用时附加回调函数。难道不能在服务定义中添加回调函数,使用一条常见的消息如“操作成功”和“操作失败”吗? - Badhon Jain

5

仅回答@Adio的问题。

当AngularJS认为任何http响应代码是错误时(只有[200,300]中的响应代码被视为成功代码),第二个回调将被调用。因此,您可以拥有一个通用的错误处理函数,而不必关心具体的错误。 那里的if语句可以用于根据错误代码执行不同的操作,但这不是必须的。


0

这只是为了通知。

从angular 1.6.x开始,success和failure已经被弃用。因此,请现在使用then和catch代替success和failure。

因此,在angular 1.6.x中,上述代码如下:

$scope.word = Word.get({ id : $routeParams.id }).then(=> () {
    //this is valid, but won't be fired if the HTTP response is 404 or any  other http-error code
}).catch(=> () {
    // error related code goes here
});

1
请注意,“已弃用”对于 Angular 团队来说意味着“完全删除”。另外,如果 $resource 没有失败处理程序,则会导致 catch(reason) 被调用,但“reason”中没有有用的信息(空字符串、null 数据、没有其他字段)。您最好/唯一的选择是使用 get().$promise.then(success(), fail()) 并确保您处理了失败函数。祝你好运。(v1.6.2) - tekHedd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接