1

サービス プロバイダーのチェーン プロミスを作成したいと考えています。

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

最後の約束が解決されるまで最後の約束が待機するように、それらを連鎖させるにはどうすればよいですか?

4

1 に答える 1

3

2 つの別個の promise オブジェクトが必要なようです。1 つは fb.load イベント用で、もう 1 つは 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;
};

また、Angular 以外のコードから resolve() を呼び出すときは常に、$rootScope.$apply() でラップする必要があることに注意してください。そうしないと、promise 'then' ハンドラーが実行されません。幸運を!

于 2013-09-11T16:05:00.960 に答える