Si tengo una función que a veces devuelve un objeto diferido pero a veces un objeto no diferido. ¿Cómo puedo decir cuál es?¿Cómo puedo determinar si se difiere un objeto jQuery?
Respuesta
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);
¡Respuesta muy útil, gracias! – nrodic
¿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
@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. " –
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
}
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
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);
- 1. ¿Cómo puedo determinar si se tocó un UILabel?
- 2. ¿Cómo puedo determinar si se gestiona un proceso en C#?
- 3. ¿Cómo puedo determinar si se muestra un botón de retroceso?
- 4. ¿Cómo puedo determinar si se implementa un método abstracto?
- 5. .NET: ¿Cómo puedo determinar si un objeto es un objeto COM?
- 6. jQuery - ¿Cómo determinar si existe un elemento padre?
- 7. ¿Cómo puedo verificar si se lanza un objeto?
- 8. ¿Cómo determinar si el objeto Javascript es un evento?
- 9. ¿Cómo puedo determinar si un archivo es un archivo PDF?
- 10. ¿Cómo puedo determinar si dos polígonos convexos se cruzan?
- 11. ¿Cómo puedo determinar si un objeto ConstructorInfo tiene un parámetro no administrado?
- 12. ¿Cómo puedo determinar si un objeto implementa un método en Perl?
- 13. ¿Cómo puedo determinar si una URL redirige?
- 14. ¿Cómo puedo determinar si una imagen se ha cargado usando JavaScript/jQuery?
- 15. ¿Cómo puedo determinar si un objeto o referencia tiene una coerción de cadena válida?
- 16. ¿Cómo puedo determinar si un archivo está vacío?
- 17. ¿Cómo puedo determinar si existe un subdirectorio en C#?
- 18. ¿Cómo determinar si un objeto es un objeto literal en Javascript?
- 19. ¿Cómo puedo determinar si un hilo de Win32 ha finalizado?
- 20. Python: determinar si un objeto es similar a un archivo
- 21. ¿Cómo puedo determinar si un paquete es RTP/RTCP?
- 22. ¿Cómo puedo determinar si intento devolver un error o no?
- 23. ¿Cómo puedo usar jQuery para determinar si un evento de clic se activa dentro de un elemento específico?
- 24. ¿Cómo puedo determinar si un pthread está vivo?
- 25. ¿Cómo puedo determinar si una función genera un gráfico
- 26. ¿Cómo puedo determinar si un archivo está bloqueado con VBS?
- 27. JQuery: ¿Cómo determinar si se ha seleccionado un botón de opción?
- 28. jQuery: compruebe si un objeto tiene clase
- 29. Cómo determinar rápidamente si un método se reemplaza en Java
- 30. Determinar si los carriles se ejecuta en un servidor web
"Tipo de comprobación" implica otros aspectos :) –
¿Cómo difieres? – alexn
bueno, tenía el mismo problema aquí –