角度の実装$q
を使用していくつかの約束をしようとしていますが、ピラミッド・オブ・ドゥームの状況に陥っている可能性があります。私がやることを好むだろうどのような
:
function doYetAnotherAsync() {
return $q(function(resolve, reject){
var transaction = {
cvc: vm.cvc,
exp_year: vm.expirationYear,
exp_month: vm.expirationMonth,
number: vm.cardNumber
}
Stripe.card.createToken(transaction, function(responseCode, response) {
console.log('createToken');
if(responseCode === 200) {
resolve({
id: core.get(response, 'id'),
cardId: core.get(response, 'card.id')
});
}
reject(response);
});
});
}
function doAnotherAsync() {
return $q(function(resolve, reject){
var globalVar;
doSomeNormalAjaxCall()
.then(function(response){
globalVar = response.id;
return doYetAnotherAsync()
})
.then(function(stripeData){
console.log('stripeData', stripeData);
// stripeData returns a $$state object
return finalAsync()
})
.then(function(response){
// handle final data here
// resolve/reject $q
})
})
}
doSomeAsync()
.then(doAnotherAsync)
お知らせdoAnotherAsync()
には、私はこのフォームを使用することができるのが大好きだ:
someAsync()
.then(function(){
return someOtherAsync()
})
.then(function(){
return yetAnotherAsync()
})
.then(function(){
// finally do some stuff
})
はピラミッドの-破滅を避けるために。
しかし、上記のコードでは、が早く解決し、$$state
オブジェクトが通常のオブジェクト{id: '', cardId: ''}
ではなく、チェーンに沿って渡されます。
console.log
ための例:
stripeData d {$$state: Object}
XHR finished loading: POST "https://api.stripe.com/v1/tokens"
createToken
約束連鎖の順序を保持し、実際のオブジェクトの応答を取得するには、私が行うことを余儀なくされました:
function doAnotherAsync() {
return $q(function(resolve, reject){
var globalVar;
doSomeNormalAjaxCall
.then(function(response){
globalVar = response.id;
return doYetAnotherAsync()
.then(function(stripeData){
// some logic
return finalyAsync()
})
})
.then(function(response){
// final processing
})
})
}
は、私がここで何をしないのですか?
間違いなく解決できます。 'globalVar'の役割は何ですか?そして、正確に 'doSomeNormalAjaxCall'とは何ですか、それはjQueryですか?そこから返される約束に間違ったことがあります。約束は不安定な約束をチェーンを通って渡すことはできません( '早期解決')。$ qと本来の約束は準拠しており、それをしません。 – estus