• Cómo revisar que un valor es una Promesa en JavaScript

    12 de julio de 2022

    - 2 min read

  • No existe en JavaScript un método que compruebe si un valor es una Promesa. Y esto puede resultar sorprendente. Obviamente puedes comprobar si un valor es una instancia de Promise y eso podría parecer suficiente. Spoiler: no lo es.

    // ⚠️ OJO! Esto funciona PERO puede traerte problemas
    // Sigue leyendo el artículo para descubrirlo
    
    const p = new Promise(() => {});
    console.log(p instanceof Promise); // true
    
    const p2 = Promise.resolve();
    console.log(p2 instanceof Promise); // true
    
    async function asyncThing() {
      return "a";
    }
    const p3 = asyncThing();
    console.log(p3 instanceof Promise); // true
    
    const p4 = fetch("https://midu.dev");
    console.log(p4 instanceof Promise); // true

    ¡En principio, pinta bastante bien! Y, seguramente, en muchos casos puede ser una buena idea. Es simple, fácil de entender y no tiene mucho misterio. ¡Pero no siempre funciona en todos los casos! ¿Por qué?

    El standard de las Promesas te sorprenderá

    Las promesas tienen su propia especificación que determina qué es una Promesa. Y esa especificación es la siguiente:

    Una promesa representa un eventual resultado de una operación asíncrona. De forma que la promise es un objeto o función con un método then que se comporta conforme a la especificación.

    function isPromise(value) { if ( p !== null && typeof p === ‘object’ && typeof p.then === ‘function’ && typeof p.catch === ‘function’ ) { return true; }

    return false; }

    console.log(isPromise(null)); // 👉️ false

    const p1 = new Promise(resolve => { resolve(10); }); console.log(isPromise(p1)); // 👉️ true