角度 |创建链式承诺

AngularJS | Create chained promise

本文关键字:承诺 创建 角度      更新时间:2023-09-26

我想为我的服务提供商创建一个链式承诺:

this.$get = function($q, $window, $rootScope) {
    var $facebook=$q.defer();
    $rootScope.$on("fb.load", function(e, FB) {
        $facebook.resolve(FB);
    });
    $facebook.api = function () {
        var args=arguments;
        args[args.length++] = function(response) {
            $facebook.resolve(response);
        };
        $facebook.promise.then(function(FB) {
            FB.api.apply(FB, args);
        });
        return $facebook.promise;
    };
    return $facebook;
};

比我呼唤承诺:$scope.user=$facebook.api("/me");

问题是,由于deferred已经解决,因此不会等到api方法解决它。

我怎样才能将它们链接起来,直到最后一个承诺将得到解决?

似乎您需要两个单独的 promise 对象:一个用于 fb.load 事件,另一个用于 API 调用的结果。

尝试追逐你的代码来阅读 -

this.$get = function($q, $window, $rootScope) {
    var apiLoaded=$q.defer();
    $rootScope.$on("fb.load", function(e, FB) {
        apiLoaded.resolve(FB);
    });
    // You should reject the promise if facebook load fails.
    $facebook.api = function () {
        var resultDefer = $q.defer(),
            args=arguments;
        args[args.length++] = function(response) {
            $rootScope.$apply(function() {
                resultDefer.resolve(response);
                // you should reject if the response is an error
            });
        };
        return apiLoaded.promise.then(function(FB) {
            FB.api.apply(FB, args);
            return resultDefer.promise;
        });
    };
    return $facebook;
};

另请注意,每当您从非角度代码调用 resolve() 时,都需要用 $rootScope.$apply() 包装它,否则承诺 'then' 处理程序不会被执行。祝你好运!