Por favor ayúdenme a entender el siguiente comportamiento de la clase Promise. He pasado mucho tiempo leyendo instrucciones y documentación, pero no puedo resolver esto por mí mismo.
const promise = new Promise(resolver=> setTimeout(resolver("i am resolver"), 1000) ) .then(resolvedParameter => el => {console.log(el); console.log(resolvedParameter)}) .then(upperFunc => upperFunc("log me this")) .then(() => console.log("do not care about the others")) .catch(e => (error = e)); promise.then(()=>console.log("test"));Esta es la salida de la consola:
registrame esto
soy resolutor
no te preocupes por los demás
prueba
En la Promesa donde se usa setTimeout no se especificó ningún valor de retorno, se devolvió la cadena "soy resolver" y se usó en el primer entonces (). Supongo que cuando llamas al resolver (como una función de resolución de promesas) devuelve el parámetro pasado para el siguiente entonces ()
En el primer entonces(), el parámetro resuelto se pasa en una función que devuelve una función que se devolverá y luego se usará en el segundo entonces(), que es lógico, y se recuerda la cadena de la primera promesa ("Soy resolver") y utilizado correctamente.
¿Puedes hacer una función entonces () con la función de resolución y rechazo? Por favor, ayúdenme a comprender qué formas tenemos disponibles para pasar datos de la primera promesa a la siguiente función, luego () y qué se espera que se devuelva desde la función entonces (). (Leí y entendí que son nuevas Promesas pero aún así el comportamiento es un poco difícil de entender)
Gracias por leer esta pregunta y cualquier idea es bienvenida.
Para obtener información general, aquí hay diferentes formas de hacer una promesa resuelta:
promise = new Promise(resolver => resolver('any value')); promise = Promise.resolve('any value'); promise = Promise.resolve().then(() => 'any value'); promise = (async () => 'any value')() Son funcionalmente equivalentes. Todos devuelven una promesa que se resuelve con el valor 'any value' .
La función .then() obtiene, como primer argumento, lo que se resolvió previamente en la cadena y puede devolver tres formas diferentes:
Todos sus ejemplos caen en la primera categoría. Aquí hay una lista de valores transmitidos en las promesas resueltas:
"i am resolver" el => {console.log(el); console.log(resolvedParameter)} undefined // because that is what the above function returns when called undefined // because that is what the console.log returns undefined // again console.log return valueAquí hay un ejemplo en el que he envuelto todos sus valores de retorno dentro de promesas:
const promise = new Promise(resolver=> resolver(Promise.resolve("i am resolver")); ) .then(resolvedParameter => Promise.resolve(el => {console.log(el); console.log(resolvedParameter)})) .then(upperFunc => Promise.resolve(upperFunc("log me this"))) .then(() => Promise.resolve(console.log("do not care about the others"))) .catch(e => Promise.resolve(error = e)); promise.then(()=>Promise.resolve(console.log("test")));Esto funciona de manera idéntica a su ejemplo, pero espero que ahora quede claro qué se transmite en la cadena.
Como han mencionado otros, el segundo argumento de .then() se llama cuando se pasa el rechazo de la cadena. Funciona igual que el método .catch() . .then(undefined, someFunc) es lo mismo que .catch(someFunc) .
[1] Estrictamente, también puede ser un "thenable", algo que tiene un método then , pero ese es un caso especial.