angularjs中deferred notify用法

deferred对象暴露了三个方法,以及一个可以用于处理promise的promise属性。

resolve(value)

resolve函数用这个值来执行deferred promise。

deferred.resolve({name: "Ari", username: "@auser"});

reject(reason)

这个方法用一个原因来拒绝deferred promise。它等同于使用一个“拒绝”来执行一个promise。

deferred.reject("Can't update user");

// 等同于

deferred.resolve($q.reject("Can't update user"));

notify(value)

这个方法用promise的执行状态来进行响应。例如,如果我们要从promise返回一个状态,可以使用notify()函数来传送它。假设我们想要从一个promise创建多个长时间运行的请求。可以调用notify函数发回一个过程通知:

MyApp.factory('GithubService', function ($q, $http) {
// 从仓库获取事件
    var getEventsFromRepo = function () {
// 任务
    }
    var service = {
        makeMultipleRequests: function (repos) {
            var d = $q.defer(),
                percentComplete = 0,
                output = [];
            for (var i = 0; i < repos.length; i++) {
                output.push(getEventsFromRepo(repos[i]));
                percentComplete = (i + 1) / repos.length * 100;
                d.notify(percentComplete);//每次获取和处理一个仓库时,发送一个过程通知
            }
            d.resolve(output);
            return d.promise;
        }
    }
    return service;
});

有了GithubService对象上的这个makeMultipleRequests()函数,每次获取和处理一个仓库时,都会收到一个过程通知。可以在我们对promise的使用中用到这个通知,在用promise时加上第三个函数调用。例如:

MyApp.controller('HomeController',
    function ($scope, GithubService) {
        GithubService.makeMultipleRequests([
            'auser/beehive', 'angular/angular.js'
        ])
            .then(function (result) {
// 处理结果
            }, function (err) {
// 发生错误了
            }, function (percentComplete) {
                $scope.progress = percentComplete;//调用通知
            });
    });

then(successFn, errFn, notifyFn)

then()方法总是返回一个新的promise,可以通过successFn或者errFn这样的返回值执行或者被拒绝。它也能通过notifyFn提供通知

 

posted @ 2016-02-23 14:57  程序猿进化之路  阅读(770)  评论(0)    收藏  举报