2014-06-23 20 views
21

Tôi có một dịch vụ gọi là paymentStrategy được tiêm vào bộ điều khiển của tôi.Chuỗi hứa hẹn với AngularJS

$scope.buy = function() { 
    paymentStrategy.buy() 
    .then(function(response) { 

    } 
} 

Phương thức mua này từ thanh toánChiến lược kích hoạt một số phương pháp cần được gọi tuần tự. Khi tất cả các phương thức bên trong purchase() được thực hiện, thì() cần phải được gọi.

Nó có lẽ là tầm thường nhưng tôi khá mới đến góc cạnh.

Hiện tại, mua(). Sau đó() được kích hoạt ngay sau phương thức init(). Tôi có cảm giác chúng ta cần phải đặt tất cả các phương pháp luận trong một loạt các lời hứa và áp dụng $ q.all().

Bất kỳ sự giúp đỡ hoặc gợi ý sẽ được đánh giá rất

angular.module('deps-app.payment.services', []). 
    factory('paymentStrategy', function($q) { 

var deferred = $q.defer(); 
var ITEM_TO_PURCHASE = "test.beer.managed"; 
var promises = []; 

var handlerSuccess = function(result) { 
     deferred.resolve(result); 
    }; 

var handlerError = function(result) { 
     deferred.reject(result); 
    }; 

_init = function() { 

    inappbilling.init(handlerSuccess, handlerError, { showLog:true }); 
    return deferred.promise; 
    } 

    _purchase = function() { 
     inappbilling.buy(handlerSuccess, handlerError, ITEM_TO_PURCHASE); 
     return deferred.promise; 
    } 

    _consume = function() { 
     inappbilling.consumePurchase(handlerSuccess, handlerError, ITEM_TO_PURCHASE); 
     return deferred.promise; 
    } 

return { 

    buy: function() { 

     _init(); 
     .then(_purchase()); 
     .then(_consume()); 

     return deferred.promise;      
    } 

} 
}); 
+1

Làm tất cả các phương pháp của anh ấy về inappbilling như init, mua và tiêu thụPurchase return promise? – Chandermani

+0

Âm thanh tốt nhưng bạn có thể làm rõ cách để làm điều đó không? –

+0

Đó là một câu hỏi cho bạn Florent. Vấn đề với mã của bạn là bạn giải quyết lời hứa trên init callback và trên callbacks khác quá, nhưng bạn cần phải chờ cho tất cả các cuộc gọi kết thúc trước khi gọi giải quyết. – Chandermani

Trả lời

19

Tạo tất cả các phương pháp nguyên tử, bằng cách thêm lời hứa của riêng họ. Trong mã của bạn, resolve đầu tiên sẽ hoàn thành toàn bộ yêu cầu.

Nếu các phương pháp có lời hứa riêng, bạn có thể dễ dàng kết nối chúng.

angular.module('deps-app.payment.services', []).factory('paymentStrategy', function($q) { 
var ITEM_TO_PURCHASE = "test.beer.managed"; 

_init = function() { 
    return $q(function (resolve, reject) { 
    inappbilling.init(resolve, reject, { showLog: true }); 
    }); 
}; 

_purchase = function() { 
    return $q(function (resolve, reject) { 
    inappbilling.buy(resolve, reject, ITEM_TO_PURCHASE); 
    }); 
}; 

_consume = function() { 
    return $q(function (resolve, reject) { 
    inappbilling.consumePurchase(resolve, reject, ITEM_TO_PURCHASE); 
    }); 
}; 

return { 
    // In this case, you don't need to define a additional promise, 
    // because placing a return in front of the _init, will already return 
    // the promise of _consume. 
    buy: function() {  
    return _init() 
     .then(_purchase) 
     // remove() from inside the callback, to pass the actual method 
     // instead the result of the invoked method. 
     .then(_consume);  
    }  
}; 

});

+0

Cảm ơn bạn rất nhiều vì đã giúp đỡ của bạn, nhiều đánh giá cao. Một câu hỏi trước khi chấp nhận nó. Dường như nó không bao giờ đi vào sau đó (..) trong phương thức buy(). Đó có phải là cách hay để làm theo cách đó không? : _init() .then (_consumeAll) .then (_purchase) .then (_consume) .then (deferred.resolve) –

+0

ah lỗi của tôi. kiểm tra ngay bây giờ –

+1

Sử dụng '$ q.defer()' là [_almost always_ bad practice] (http://www.codelord.net/2015/09/24/$q-dot-defer-youre-doing-it-wrong /), Và đây không phải là ngoại lệ. Mỗi hàm trong ba hàm có thể được đơn giản hóa bằng cách thực hiện một cái gì đó như '_init = function() {return $ q (hàm (resolve, reject) {inappbilling.init (resolve, reject, {showLog: true});}); }; 'sẽ trả về một lời hứa như mong muốn. Lý tưởng nhất, các phương thức 'inappbilling' sẽ trả về các lời hứa (chỉ đơn giản là trả về bởi các phương thức _init, vv) của bạn, nhưng tôi cho rằng đó có thể không phải là quyết định của bạn. –

46

Nếu bạn cần lời hứa chuỗi trong tuần tự kiễu góc, bạn chỉ có thể trả lại những lời hứa từ một đến khác:

callFirst() 
.then(function(firstResult){ 
    return callSecond(); 
}) 
.then(function(secondResult){ 
    return callThird(); 
}) 
.then(function(thirdResult){ 
    //Finally do something with promise, or even return this 
}); 

Và nếu bạn muốn trả lại tất cả điều này dưới dạng API:

function myMethod(){ 
    //Return the promise of the entire chain 
    return first() 
      .then(function(){ 
       return second(); 
      }).promise; 
} 
+0

Tôi mới hứa hẹn và cũng có góc cạnh. ở đây đầu tiên sau đó trở về cuộc gọi thứ hai sau đó nhưng nó là phương pháp trở về, thực sự thứ hai sau đó có giá trị như đối số right.I biết chỉ C vì vậy tôi không chắc chắn. – santhosh

+1

Rất đơn giản và mạnh mẽ! Cảm ơn bạn. Tôi hiểu những gì tôi phải làm, chỉ sau khi tôi đọc bài viết của bạn. Tất cả các ví dụ khác tôi thấy rất phức tạp. – tarekahf

Các vấn đề liên quan