2013-03-27 11 views
6

Jako przykład:q.js: czy mogę zatrzymać wykonywanie funkcji, dopóki nie spełni się obietnica?

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 

Czy to w ogóle możliwe?

Alternatywy jakie widzę, to albo zawsze wywołanie funkcji asynchronicznej, wyrzucenie czeku "foo", który jest mniej optymalny, ale działałby w kodzie; lub po prostu zakładając, że "foo" jest prawdziwe i rzuca błąd, jeśli jest fałszywy (wymagający od osoby dzwoniącej, aby spróbował ponownie po wywołaniu funkcji asynchronicznej), która jest jeszcze mniej idealna z oczywistych powodów.

EDIT: jako tymczasowe obejście, znalazłem to działa, ale to prawie idealna:

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 
}); 

Odpowiedz

6

Q.when() mogą być wykorzystane za dokładnie to, kiedy nie wiesz, czy wartość jest obietnicą, czy nie.

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

Idealne, właśnie tego chciałem! Dzięki! –

+2

Należy zauważyć, że formami kanonicznymi są 'Q (valueOrPromise) .then (onFulfilled)' lub 'Q.when (valueOrPromise, onPulfilled)'. Twoje też działa, ale jest mniej idiomatyczne :) – Domenic

0

Można, poprzez zdefiniowanie funkcji, takich jak:

function do_this(err) { 
    // yay. 
} 

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

Ja mniej więcej zrobiłem to tylko przy użyciu biblioteki Q, zobacz moją zredagowaną odpowiedź. Dzięki za twoje wejście :) –

Powiązane problemy