如果promise是通知,AngularJS最终不会执行

时间:2015-07-22 12:02:49

标签: angularjs angular-promise

在我的AngularJS应用程序中,我试图在finally来电中使用$http

这是我的服务

app.service("webResource", function($http, $q) {
    return {
        post : function(url, json) {
            var defer = $q.defer();
            $http.post(url, json)
            .success(function (data, status) {
                if (data!=null) {
                    defer.resolve(data);
                } else {
                    defer.notify("Send notify....");
                }
            }).error(function (data, status) {
                defer.reject({"response":data, "status": status});
            });

            return defer.promise;
        }
    };
});

在我的控制器中我有

$scope.callServer = function() {
    var promise = webResource.post('someurl',$scope.data);
    promise
    .then(
        function(data) {
            alert("Success");
            //Do for success
        },
        function(data) {
            alert("Error");
            //Do for failure
        },
        function(data) {
            alert("Notify");
        }
    ).finally(function() {
        alert("Finally");
    });
};

如果它已被解决或拒绝,它可以正常工作。但是,如果它通知了"通知" ,但随后没有提醒"最后" 。那是为什么?

我使用的是AngularJS 1.4.2版本

2 个答案:

答案 0 :(得分:4)

.finally采用以下形式进行两次回调:

.finally(callback, notifyCallback)

您目前只向您的finally处理程序发送一个回调,因此您只会在alert('Finally!)resolve上触发reject

.finally步骤添加第二个回调,当您执行deferred.notify时, 会看到触发回调。

<强> docs ($q.promiseAPI)

答案 1 :(得分:0)

它最终没有去的原因是因为你可以有多个通知。来自文档:

“notify(value) - 提供有关承诺执行状态的更新。在承诺解决或被拒绝之前,可以多次调用。”

最后一旦承诺完全结束(解决和拒绝完成承诺)

https://docs.angularjs.org/api/ng/service/$q#the-deferred-api