2012-06-09 11 views

risposta

48

A seconda del caso d'uso, si potrebbe anche usare jQuery.when [1]:

Se un singolo argomento viene passato alla jQuery.when e non è una differita, si sarà trattato come un risolta differite e tutti i ritirati allegati saranno eseguiti immediatamente.

Con jQuery.when è possibile trattare il misterioso oggetto sempre come differito:

// x could be a deferred object or an immediate result 
var x = getMysteriousObject(); 
// success will be called when x is a deferred object and has been resolved 
// or when x is an immediate result 
jQuery.when(x).then(success, error); 

[1] http://api.jquery.com/jQuery.when/

+0

Risposta molto utile, grazie! – nrodic

+0

il tuo gestore "success" non avrà potenzialmente altri argomenti passati, a seconda che l'oggetto sia differito o meno? Nel qual caso dovrai ancora usare la digitazione anatra come suggerito di seguito. – backdesk

+1

@Crungmungus: "Se un singolo argomento viene passato a jQuery.when e non è un rinviato o una promessa, verrà considerato come un rinviato risolto e tutti i callback eseguiti verranno immediatamente eseguiti. " –

29

Poiché jQuery Deferred viene creato copiando i metodi di un oggetto nascosto anziché chiamare il nuovo operatore su una funzione, non è possibile provare che l'oggetto sia effettivamente un'istanza di jQuery.Deferred. Penso che tu avrai bisogno di andare con Duck-Typing:

"Quando vedo un uccello che cammina come un'anatra e nuota come un'anatra e fa qua qua come un'anatra, che io chiamo quell'uccello un'anatra." - James Whitcomb Riley

A seconda di quali oggetti potrebbero altrimenti essere restituiti (quali proprietà deve essere previsto), verificare se particolari proprietà/metodi sono presenti:

var x = getMysteriousObject(); 
if (x.promise) { 
    // Deferred 
} else { 
    // Not a deferred 
} 

È possibile dettagliato questo controllo, se richiesto :

if ($.isFunction(x.promise)) { 
    // Deferred 
} 

o (per distinguere tra oggetti anticipate e altre implementazioni dell'interfaccia promessa)

if (x.promise && x.resolve) { 
    // Deferred 
} 
+0

Ok, allora penso che battere a macchina è il modo migliore per andare. Ero preoccupato di ottenere una quaglia invece di un'anatra. Ora pensa che non sia così importante. Grazie molto! – WawaBrother

1

Ispirato da Niko's answer, ho creato un'altra implementazione che avrebbe controllare se un oggetto è un differita in base al nome delle sue proprietà ma anche sul contenuto di tali proprietà. Dovevo farlo perché un altro mio oggetto aveva una proprietà chiamata promessa.

if (typeof value.resolve !== "function") { 
    return false; 
} 
return String(value.resolve) === String($.Deferred().resolve); 
Problemi correlati