javascript - Angular promise 行为

标签 javascript angularjs angular-promise deferred

<分区>

在阅读 this article 后,我正在尝试比较两种在 Angular 中使用 promises 的方法。 .

所以我使用这段代码来比较是否使用 deferred。注:地址http://localhost:1337/error返回具有 http 500 状态的响应和作为错误数据的消息“错误”(这是预期的行为)。

.controller("HomeCtrl", function($q, $http) {
    function doAsyncCallDeferred() {
        var deferred = $q.defer();
        $http.get("http://localhost:1337/error")
            .catch(function(errorData) {
                // error
                deferred.reject(errorData.data);
            });
        return deferred.promise;
    }

    function doAsyncCall() {
        return $http.get("http://localhost:1337/error")
            .catch(function(errorData) {
                // error
                return errorData.data;
            });
    }

    doAsyncCallDeferred()
        .then(function (data) {
            console.log("with deferred success");
            console.log(data);
        })
        .catch(function(errorData) {
            // data should be "error"
            console.log("with deferred error");
            console.log(errorData);
        });

    doAsyncCall()
        .then(function (data) {
            console.log("without deferred success");
            console.log(data);
        })
        .catch(function(errorData) {
            // data should be "error"
            console.log("without deferred error");
            console.log(errorData);
        });
})

但我对结果感到困惑:

with deferred error
error
without deferred success
error

我假设这两种方法都会执行 catch 回调,但似乎并非如此。请问有人可以解释这种行为吗?

最佳答案

.then.catchtry/catch 的异步“等价物”。当您.catch 某些东西时,这意味着您“处理”了它。

doAsyncCall 中,您正在处理“异常”(这是一个 promise 拒绝)并将 errorData.data 作为 data 返回给下一个.然后。如果你想“重新抛出”,那么return $q.reject(errorData.data)

doAsyncCallDeferred 中,您明确拒绝了一个 promise 。

例如,以下等同于他们的用户:

function doAsyncCallDeferred() {
    var deferred = $q.defer();
    $http.get("http://httpstat.us/500")
        .then(function(response){
           deferred.resolve(response.data);
        })
        .catch(function(errorData) {
           deferred.reject(errorData.data);
        });
    return deferred.promise;
}

function doAsyncCall() {
    return $http
             .get("http://httpstat.us/500")
             .then(function(response){
                return response.data;
             })
             .catch(function(errorData){
                return $q.reject(errorData.data);
             });

}

关于javascript - Angular promise 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31749374/

相关文章:

javascript - JS/Jquery变量改变事件

javascript - 转发器内的 ng 消息未出现

javascript - AngularJS服务延迟API调用

javascript - 为什么我的 Promise 链不能以这种嵌套方式工作?

javascript - Angular 中基于数组值的带有 Promise 的多个 Ajax 请求

javascript - 如何在Mark.JS中获取词干突出显示?

javascript - 如何在ReactJs上使轮播自动更改而不是单击带有循环的onclick

javascript - AngularJS 不等待 HTTP 请求完成

javascript - 如何在主文本框值中显示最终结果

angularjs - 服务器是否需要使用Polymer.dart和/或Angular.Dart运行某些CLIENT端DART应用程序?