Entradas con la etiqueta ‘error’

JS – Manejo de errores con Async/Await

Publicado por Iván Gajate el 21 de noviembre de 2020 en Desarrollo Web, JavaScript | No hay comentarios »

Las promesas me encantan. Hacen muy fáciles las llamadas asíncronas en JavaScript. Aunque a veces su sintaxis es un poco engorrosa.

cargarDatos() {
   obtenerListadoUsuarios()
   .then(mostrarResultado)
   .catch(haHabidoUnError);
}

Utilizando la sintáxis Async/Await podemos simplificar su uso.

async cargarDatos() {
   const usuarios = await obtenerListadoUsuarios();
   // Si la consulta falla no llega a esta línea :(
   mostrarResultado(usuarios);
}

Mucho más fácil de leer y mantener :D.

El problema es, que cuando el método falla, la línea de la consulta dará un error de JavaScript y el resto de nuestro código dejará de funcionar.
Mal asunto 🙁

Se suele utilizar el Try/Catch para controlar el error, pero… en mi opinión eso es como seguir usando el Then/Catch pero con otro nombre!!!

Realmente await devuelve una Promesa, por lo que se le puede concatenar un catch al final. En ese catch podemos controlar el error y devolver un valor por defecto.
Si falla la consulta devuelvo undefined. De esta forma, el valor de usuarios es, o el resultado de la consulta, o undefined.
En cualquier caso el código continuará y posteriormente puedo controlar y gestionar si el resultado ha sido el esperado o undefined.
Un error controlado.

async cargarDatos() {
   const usuarios = await obtenerListadoUsuarios().catch(() => undefined);
   // La consulta devolverá el resultado o undefined
   if (usuarios) {
      mostrarResultado(usuarios);
   }
}

O bien si se espera un Array con valores, se puede devolver un Array vacío en caso de error y continuar el flujo.

async cargarDatos() {
   const usuarios = await obtenerListadoUsuarios().catch(() => []);
   // La consulta devolverá el resultado o [], pero no fallará
   mostrarResultados(usuarios);
}

Cordova – Problema de seguridad al cargar archivos del dispositivo

Publicado por Iván Gajate el 30 de noviembre de 2016 en Desarrollo Web, JavaScript | Los comentarios están cerrados.

Si estamos tratando de cargar un archivo desde el móvil, por ejemplo tras buscarlo con el explorador de archivos de Android, seguramente nos dará un error como este:

Refused to connect to 'content://...' because it violates the following Content Security Policy directive...

Esto es debido a que las rutas de tipo «content://…» no son rutas válidas cuando hacemos un window.resolveLocalFileSystemURL (plugin File)

Para obtener la ruta real (del tipo file:///…) necesitamos usar Cordova Plugin FilePath, así:

window.FilePath.resolveNativePath('content://com.android.externalstorage.documents/document/...', successCallback);
 
function successCallback(realPath){
   console.log(realPath);   // file:///storage/emulated/0/Android/data...
}

Lo he encontrado tras mucho buscar, en Ourcodeworld

Descargar Cordova Plugin FilePath

JS – Internet Explorer Shim

Publicado por Iván Gajate el 26 de abril de 2014 en JavaScript | Los comentarios están cerrados.

Si nuestro código falla inexplicablemente en Internet Explorer 8 seguramente sea porque estamos llamando a alguna función que no existía por aquel entonces, como trim, indexOf, forEach
Para solucionarlo podemos incluir este js en nuestra página y todo volverá a funcionar como debería 🙂

https://github.com/es-shims/es5-shim/blob/master/es5-shim.js

Error al cargar un archivo de Github

Publicado por Iván Gajate el 20 de julio de 2013 en Desarrollo Web, JavaScript | Los comentarios están cerrados.

Si al tratar de enlazar un archivo directamente de Github nos da un error por el MIME Type, se puede solucionar cambiando

Esto:

https://raw.github.com/user/repo/master/filename.js

Por esto:

https://rawgithub.com/user/repo/master/filename.js

Visto en http://rawgithub.com/

Error al enviar un + por flashvars

Publicado por Iván Gajate el 26 de septiembre de 2011 en AS3, Flash | 14 comentarios »

Pues eso, que resulta que sin intentas pasarle al flash un «+» por flashvars, no lo entiende y lo sustituye por un espacio en blanco (» «).

Solución: Cambiar el «+» por «%2b»

Visto en http://userflex.wordpress.com/2009/01/29/special-chars-in-flashvars/ por Javi, gracias Javi!! 😉

AS3 – Cargar Assets Usando un Proxy

Publicado por Iván Gajate el 26 de abril de 2011 en AS3, Flash | 2 comentarios »

Cuando tratamos de cargar imágenes o xmls de otros dominios, nos encontramos con el problema de que por seguridad no es posible hacerlo directamente. Si tenemos acceso al otro dominio, podemos usar el “crossdomain.xml”, pero si no, podemos recurrir a un proxy.

Para entenderlo mejor, aquí hay un tutorial muy explicativo.

La forma de saltarse el problema es cargar las cosas con un php intermedio que se encuentra en nuestro servidor (proxy), y que sencillamente nos devuelve lo que le hemos pedido en el formato que corresponde. Así, con este php en nuestro servidor (proxy.php):

<?php
 
header("Access-Control-Allow-Origin: *");
 
 if (isset($_GET['url'])) {
	$url = urldecode($_GET['url']);
} else {
	die('error=1');
}
 
$ext = pathinfo($url, PATHINFO_EXTENSION);
 
switch ($ext) {
	case "jpg":
		header('Content-Type:image/jpeg');
		readfile($url);
		break;
	case "gif":
		header('Content-Type:image/gif');
		readfile($url);
		break;
	case "png":
		header('Content-Type:image/png');
		readfile($url);
		break;
	default:
		header('Content-Type:text/html; charset=utf-8');
		readfile($url);
		break;
	}
?>

En lugar de llamar a:

http://www.otrodominio.com/imagen1.jpg

Lo haremos a:

 http://www.midominio.com/proxy.php?url=http://www.otrodominio.com/imagen1.jpg

Y si queremos cargar un HTML completo de otra página, solo tenemos que tener cuidado si lleva variable en la url:

var proxy = 'proxy.php?url=' + encodeURIComponent('http://www.otrodominio.com/search.php?q=programacion+as3');  //Para evitar la ?
 
jQuery.get(proxy, resultadosOk);
 
// Formateo el resultado
function resultadosOk(data) {
 
}

De esta manera nos saltaremos el problema del sandbox 🙂