2013-03-27 19 views
6

:q.js: Bir işlev yerine getirilinceye kadar bir işlevi yürütmeyi durdurabilir miyim? Örnek olarak

if(foo) { 
    async_call(); // returns a Q promise object 
} 
// do this immediately if foo was false 
// or after the promise is resolved if foo was true 

bu mümkün olabilir mi?

Gördüğüm alternatifler ya her zaman async işlevini çağırıyor, daha az uygun olan ancak kod içinde çalışacak 'foo' kontrolünü atıyor; ya da sadece 'foo' nun doğru olduğunu varsayarak ve yanlışsa bir hata atıyor (arayanın async işlevini çağırdıktan sonra tekrar denemesini gerektiriyor) ki bu da belli sebeplerden daha az ideal.

DÜZENLEME:

var promise = foo ? Q.defer().resolve(foo).promise : async_call(); 
promise.then(function(foo) { 
    // this is done after the async call if it was necessary or immediately if not 
}); 

cevap

6

Q.when() kullanılabilecek bir geçici çalışma etrafında, bu çalışır, ancak pek ideal bulduğumuz gibi tam olarak bunun için, bir değerin bir söz olup olmadığını bilmediğinizde.

Q.when(foo || async_call()).then(function (foo) { 
    //... 
}); 
+1

Mükemmel, istediğim buydu! Teşekkürler! –

+2

Kanonik formların 'Q (valueOrPromise) .then (onFulfilled)' veya 'Q.when (valueOrPromise, onFulfilled)' olduğunu unutmayın. Seninki de çalışıyor, ama daha az deyimsiz :) – Domenic

0

,, gibi bir işlev tanımlayarak yapabilirsiniz:

function do_this(err) { 
    // yay. 
} 

if(foo) { 
    async_call(arguments, do_this); 
} else { 
    do_this(); 
} 
+0

Tam olarak bunu yalnızca Q kütüphanesini kullanarak yaptım, düzenlenmiş cevabımı inceleyin. Girişiniz için teşekkürler :) –

İlgili konular