2014-06-23 29 views
21
ile Zincir vaatleri

Denetleyicime enjekte edilen paymentStrategy adlı bir hizmetim var.AngularJS

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

    } 
} 

PaymentStrategy'den alınan bu satın alma yöntemi, sırayla çağrılması gereken çeşitli yöntemleri tetikler. Buy() içindeki tüm yöntemler tamamlandığında, o zaman() çağrılmalıdır.

Muhtemelen önemsiz ama ben açısal olarak oldukça yeniyim.

Şu anda satın al(). Sonra(), init() yöntemlerinden sonra doğrudan tetiklenir. Tüm bu yöntemleri bir dizi vaatte yerine koymamıza ve $ q.all() uyguladığımızı hissediyorum.

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

Ve eğer: Herhangi bir yardım veya öneri büyük ölçüde Açısal sırayla zincir vaat gerekiyorsa, sadece birinden diğerine sözler dönebilirsiniz

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

Tüm init, in, satın alma ve tüketme gibi geri alma vaadiyle geri alma vaadini nasıl yapar? – Chandermani

+0

Kulağa hoş geliyor ama bunu yapmanın yolunu açıklayabilir misiniz? –

+0

Bu sana bir soru oldu Florent. Kodunuzdaki sorun, init geri aramada ve diğer geri aramalarda da söz konusu sorunu çözmenizdir, ancak tüm çağrıların çözülmeden önce bitmesi için beklemeniz gerekir. – Chandermani

cevap

19

Tüm yöntemleri atomar yapın, kendi sözlerini ekleyerek. Kodunuzda, ilk resolve tüm isteği tamamlayacaktır. Yöntemlerin kendi vaatleri varsa, bunları kolayca zincirleyebilirsiniz. ILLUSTRATORNG.

+0

Yardımlarınız için çok teşekkür ederim, çok takdir ediyorum. Bunu kabul etmeden önce bir soru. Görünüşe göre o zaman (..) buy() metodunda. Bu şekilde yapmanın iyi bir yolu var mı? : _init() .o (_consumeAll) .o (_purchase) .o (_consume) .o (deferred.resolve) –

+0

ah benim hatam. şimdi kontrol edin –

+1

'$ q.defer()' ın kullanılması [_almost always_ bad practice] 'dir (http://www.codelord.net/2015/09/24/$q-dot-defer-youre-doing-it-wrong /) ve bu bir istisna değildir. Üç fonksiyonun her biri, _init = function() {return $ q (işlev (çözümleme, reddetme) {inappbilling.init (çöz, reddet, {showLog: true});}) gibi bir şey yapılarak basitleştirilebilir; }; 'istenen bir söz verecek. İdeal olarak, 'inappbilling' yöntemlerinin vaatlerini iade etmelidir (basitçe _init, vs yöntemleriniz tarafından iade edilir), ancak bu sizin karar vermeniz olmayabilir. –

46

mutluluk duyacağız

Tüm bunları bir API olarak döndürmek için:

+0

Ayrıca söz veriyorum ve köşeli de. Burada ilk önce ikinci çağrıları döndürür, ancak bu yöntem, aslında ikincisi sonra argüman olarak doğru değeri alır. Sadece C'yi bilirim, emin değilim. – santhosh

+1

Çok basit ve çok güçlü! Teşekkür ederim. Yapmam gerekeni anladım, sadece yazıyı okuduktan sonra. Bulduğum diğer tüm örnekler çok karmaşıktı. – tarekahf