En el siguiente código, los valores se DEVUELVEN correctamente desde una cadena Promise.then() en cola.
CÓDIGO:
let cond_1 = true; let data = 'Data Received....'; let err = 'Error'; var p1 = new Promise(function(resolve,reject){ if(cond_1){ resolve(data); }else{ reject(err); }}) p1.then((data)=>{console.log(data);return 'Wait....';}) .then((val1)=>{console.log(val1); return 'Finished';}) .then((val2)=>{console.log(val2)}) .catch((err)=>{console.log(err)});Producción :
Data Received.... Wait.... FinishedSin embargo, los mismos valores DEVUELTOS de una función SetTimeout encadenada se devuelven 'INDEFINIDO'.
CÓDIGO:
p1.then((data)=>{console.log(data); return 'Wait.....'; }) .then((val1)=>{setTimeout(function(val1){console.log(val1); return 'Finished';},1000)}) .then((val2)=>{setTimeout(function(val2){console.log(val2);},1000)}) .catch((err)=>{console.log(err)});Producción:
Data Received.... undefined undefined¿Cómo resolver esto?
Intente aprovechar la naturaleza lexicográfica de Javascript.
En lugar de hacer una función v1,v2 que sus funciones tomen dentro de setTimeout, simplemente use una función de flecha. De esta manera, está utilizando el v1, v2 devuelto por la promesa.
Hacer esto
let cond_1 = true; let data = 'Data Received....'; let err = 'Error'; var p1 = new Promise(function(resolve, reject) { if (cond_1) { resolve(data); } else { reject(err); } }) p1.then((data) => { console.log(data); return 'Wait.....'; }) .then((val1) => { setTimeout(() => { console.log(val1); }, 1000); return 'Finished'; }) .then((val2) => { return setTimeout(() => { console.log(val2) }, 1000) }) .catch((err) => { console.log(err) });Lo que hizo fue crear una nueva variable v1,v2 para su función. Solo puede usar eso cuando pasa el valor v1, v2 en esa función. Esa función no usará v1,v2 devuelto de la promesa como espera.