Búsqueda de sitios web

javascript - ¿Cuál es el valor de resolución de una Promesa encadenada si un manejador then no devuelve nada?


Si un manejador then no tiene una declaración return, la promesa encadenada resultante toma el valor undefined en bluebird. Pero no puedo ver en ninguna parte que esto esté especificado en Promises/A+ ni en ningún otro lugar. ¿Se puede contar con este comportamiento?

Aquí hay un programa de prueba:

var Promise = require('bluebird');

var p = Promise.resolve('test');

p.then(function(s) {
    console.log('s1='+s);
    // no return
}).then(function(s) {
    // bluebird prints "undefined".  is this specified by a standard?
    console.log('s2='+s);
});

Respuesta #1

Promises/A+ especifica usar el valor de retorno de una función de devolución de llamada para resolver la promesa.

Cada llamada a función que no lanza una excepción (que tiene una "finalización normal", en términos de la especificación) sí tiene un valor de retorno de este tipo. Si la ejecución de una función no encuentra una instrucción return, este valor será undefined. Esto se hace explícito en la especificación en la sección 9.2.1.

Respuesta #2

Ese es un comportamiento esperado y ocurriría incluso si no usas bluebird. Si no resuelves explícitamente con un valor, el valor es undefined, como es típico en JS.

Consulta este enlace para el libro "No conoces JS". Lo explica bien.