2012-06-09 22 views

Respuesta

48

Dependiendo de su caso de uso, también se puede utilizar jQuery.when [1]:

Si un solo argumento se pasa a jQuery.when y no es un diferido, será tratado como un diferido Resolver y cualquier doneCallbacks adjunto se ejecutará de inmediato.

Con jQuery.when se puede tratar a su misterioso objeto siempre como aplazada:

// 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

¡Respuesta muy útil, gracias! – nrodic

+0

¿su manejador de "éxito" posiblemente no tendrá diferentes argumentos pasados ​​a él, dependiendo de si el objeto fue diferido o no? En ese caso, todavía tendrá que usar pato-tipado como lo que se sugiere a continuación. – backdesk

+1

@Crungmungus: "Si se pasa un solo argumento a jQuery.when y no es un Deferred o una Promesa, se tratará como un Deferred resuelto y cualquier doneCallbacks adjunto se ejecutará inmediatamente. Los doneCallbacks se pasan el argumento original. " –

29

Dado que jQuery Deferreds se crea al copiar los métodos de un objeto oculto en lugar de llamar al nuevo operador en una función, no se puede probar que el objeto sea realmente una instancia de jQuery.Deferred. Creo que vas a necesitar para ir con Pato-Typing:

"Cuando veo un pájaro que camina como un pato y nada como un pato y grazna como un pato, llamo a ese pájaro un pato." - James Whitcomb Riley

Dependiendo de qué objetos de otro modo podrían ser devueltos (qué propiedades debe esperarse), comprobar si determinadas propiedades/métodos están presentes:

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

Usted puede detalla esta comprobación, si es necesario :

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

o (para distinguir entre los objetos diferidos y otras implementaciones de la interfaz Promise)

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

Ok, entonces creo que escribir sobre patos es la mejor manera de hacerlo. Estaba preocupado por conseguir una codorniz en lugar de un pato. Ahora piensa que no es tan importante. ¡Muchas gracias! – WawaBrother

1

Inspirado por Niko's answer, he creado otra aplicación que comprobar si un objeto es un diferido basado en el nombre de sus propiedades pero también en el contenido de esas propiedades. Tenía que hacerlo ya que otro objeto mío tenía una propiedad llamada promesa.

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