<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>jQuery &#8211; dirtysock</title>
	<atom:link href="https://dirtysock.es/tag/jquery/feed/" rel="self" type="application/rss+xml" />
	<link>https://dirtysock.es</link>
	<description>Not all those who wander are lost</description>
	<lastBuildDate>Fri, 19 Nov 2010 09:21:38 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.9</generator>
<site xmlns="com-wordpress:feed-additions:1">31366000</site>	<item>
		<title>Cancelar llamadas AJAX previas</title>
		<link>https://dirtysock.es/cancelar-llamadas-ajax-previas/</link>
					<comments>https://dirtysock.es/cancelar-llamadas-ajax-previas/#comments</comments>
		
		<dc:creator><![CDATA[Jose]]></dc:creator>
		<pubDate>Fri, 19 Nov 2010 09:21:38 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[jQuery]]></category>
		<guid isPermaLink="false">http://dirtysock.es/?p=1535</guid>

					<description><![CDATA[Hace pocos dias, mientras creaba el típico auto-suggest de los inputs de los formularios (en este caso de lugares &#8211; ciudades, calles, etc) vi que al tener que realizar una llamada AJAX al web service de geocoding de Google Maps APIs las llamadas se me solapaban dando lugar a un tiempo de espera mayor. Esto [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Hace pocos dias, mientras creaba el típico<strong> auto-suggest de los inputs de los formularios</strong> (en este caso de lugares &#8211; ciudades, calles, etc) vi que al tener que realizar una llamada AJAX al web service de geocoding de Google Maps APIs las llamadas se me solapaban dando lugar a un tiempo de espera mayor. Esto era debido a que la petición la lanzaba tras el evento <code lang="javascript" nowrap="true" inline="true">onKeyUp</code>, por lo que si se escribia muy rápido en el <code lang="javascript" nowrap="true" inline="true">input</code>, se lanzaban <strong>muchas peticiones muy seguidas</strong> y la <strong>experiencia de usuario era bastante mala</strong>. El efecto que se conseguia era que al acabar de escribir, las respuestas iban llegando y se iban cargando una detrás de otra e incluso parercía que el navegador llegaba a colapsarse.</p>
<p><a href="https://i0.wp.com/dirtysock.es/wp-content/uploads/2010/11/before.jpg"><img loading="lazy" src="https://i0.wp.com/dirtysock.es/wp-content/uploads/2010/11/before-300x58.jpg?resize=300%2C58" alt="" title="before" width="300" height="58" class="center" data-recalc-dims="1" /></a></p>
<p class="center small">Antes de cancelar las llamadas previas, unas se superponian a otras dando lugar a un tiempo de respuesta mayor y a una mala experiencia de usuario</p>
<p>La idea pues fue que <strong>al lanzar una nueva petición AJAX, se cancelara la anterior</strong> de manera que sólo hubiera <strong>solo una activa</strong> y por tanto sólo se cargaran datos durante las pausas de escritura en el input, y del mismo modo haciendo que mientras se escribía de forma rápida,<strong> no colapsar el servidor</strong> con llamadas haciendo todo el proceso de una forma <strong>menos trabada</strong>.</p>
<p><a href="https://i0.wp.com/dirtysock.es/wp-content/uploads/2010/11/after.jpg"><img loading="lazy" src="https://i0.wp.com/dirtysock.es/wp-content/uploads/2010/11/after-300x58.jpg?resize=300%2C58" alt="" title="after" width="300" height="58" class="center" data-recalc-dims="1" /></a></p>
<p class="center small">Cancelando las llamadas anteriores, se consigue que los resultados se muestren de forma más rápida y de forma menos trabada.</p>
<p>Entonces empecé a googlear como hacer esto, y encontré algunas respuestas pero ninguna me funcionó (como la de relanzar la petición para cancelar la anterior) y otras me parecieron muy complicadas para el cometido sencillo que tenia (aplicar un patrón observador). Incluso me encontré con quien decía que era imposible abortar la llamada AJAX desde el cliente (navegador).</p>
<p>Pues bie, gracias a <strong>jQuery </strong>encontré una solución muy sencilla aprovechando el evento <strong>beforeSend</strong>. Se trata de crear una variable global, donde guardaremos la conexión HTTPRequest, y en dicho evento <strong>beforeSend </strong>miraremos si hay alguna conexión, si la hay, abortaremos mediante la función <strong>abort()</strong> y meteremos la nueva conexión realizada en la variable global. Dando paso encontes al evento success, complete o error sólo con una conexión activa. Nuestra llamada AJAX con jQuery deberia quedar más o menos así, sin olvidar declarar la variable httpR como global:<br />
[cc lang=&#8221;javascript&#8221;]<br />
$.ajax({<br />
	url: &#8216;La URL a llamar&#8217;<br />
	beforeSend: function(data2){<br />
	/*httpR es la variable global donde guardamos la conexion*/<br />
	if(httpR){<br />
		/*Si habia alguna conexion anterior, la cancelamos*/<br />
		httpR.abort();<br />
	}<br />
	/*Guardamos la nueva conexion*/<br />
	httpR = data2;<br />
	},<br />
	success: function(data) {<br />
		/*Handler al recibir los datos OK*/<br />
	},<br />
	error: function(e, xhr){<br />
		/*Handler de error en la funcion*/<br />
	}<br />
});<br />
[/cc]<br />
Para ver la mejora que se consigue, he preparado una demo que podéis <a href="http://dirtysock.es/demos/demo1.html">ver aquí </a>y <a href="http://dirtysock.es/demos/demo1.rar">descargar </a>los archivos para probarlo.<br />
<a href="http://dirtysock.es/demos/demo1.html">Ver demo</a> &#8211; <a href="http://dirtysock.es/demos/demo1.rar">Descargar archivos</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://dirtysock.es/cancelar-llamadas-ajax-previas/feed/</wfw:commentRss>
			<slash:comments>8</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1535</post-id>	</item>
	</channel>
</rss>
