Estoy tratando de hacer una función que tome una serie de objetos y forme una tabla a partir de ellos. Pero quiero que sea como esas promesas donde podemos tener promise().then().catch() básicamente solo quiero la .then() y .catch() en mi función. Intenté hacer esto:
function makeTable(tableContent) { tableContent.forEach((cell) => { let type = cell.type return new Promise(function(resolve, reject){ if (type === "th" || type === "tr") { resolve("works") } else { reject(`Cell type must be either "th" or "tr" you passed "${type}"`) } }) }) } let table = [ { type: "pf", }, ] makeTable(table).then(()=>console.log("Success!")).catch(err=>console.log(err))Pero obviamente esto no funciona. Quería obtener esta funcionalidad porque solo quería saber más sobre las promesas y quería crear una función que pudiera hacer lo mismo. Desafortunadamente, no puedo encontrar ningún lugar en Internet que responda esto. Gracias por leer esta pregunta!!
Algunas personas preguntan si por qué realmente necesito hacerlo aunque puedo hacerlo de otras maneras. ¿Por qué sólo promesas? Bueno, en realidad solo quiero jugar con ellos para poder entenderlos mejor y esa es la razón de esta pregunta.
Ser "un gran admirador de las promesas" es una cosa, pero usarlas donde no son absolutamente necesarias es simplemente una mala educación.
Dicho esto, si desea operar con una serie de promesas, puede usar Promise.all() :
function makeRow(row) { return Promise.all(row.map(({type}) => new Promise((resolve, reject) => { if (type === 'th' || type === 'td') { resolve('Works'); } else { reject(`Cell type must be either "th" or "td" you passed "${type}"`) } }))); } const row = [{ type: 'th' }, { type: "pf" }]; makeRow(row) .then(() => console.log("Success!")) .catch(console.dir);Vale la pena señalar que en realidad no necesita promesas aquí, ya que todo es sincrónico. Dicho esto, si quieres hacer esto, tienes 2 enfoques.
Puede devolver una sola Promesa al final de todo:
function makeTable(tableContent) { return new Promise((resolve, reject) => { tableContent.forEach((cell) => { let type = cell.type; if (type !== 'th' && type !== 'tr') { reject(`Cell type must be either "th" or "tr" you passed "${type}"`); } }); resolve('works'); }); }o puede devolver una Promesa para cada artículo, convirtiendo cada uno en una Promesa y envolviéndolos con Promise.all()
function makeTable(tableContent) { return Promise.all( tableContent.map((cell) => { let type = cell.type; return new Promise(function (resolve, reject) { if (type === 'th' || type === 'tr') { resolve('works'); } else { reject(`Cell type must be either "th" or "tr" you passed "${type}"`); } }); }) ); }Bueno. Entonces, en primer lugar, no creo que haya ninguna necesidad de Promesas aquí. Y no debemos abusar del concepto ya que puede causar problemas de rendimiento. Si aún desea usar promesas, puede devolver la matriz de promesas y puede recorrer allí.
function makeTable(tableContent) { let prmsArr = []; tableContent.forEach((cell) => { let type = cell.type; prmsArr.push(new Promise(function(resolve, reject){ if (type === "th" || type === "tr") { console.log('Hi'); resolve("works"); } else { console.log('Hello'); reject(`Cell type must be either "th" or "tr" you passed "${type}"`); } })); }); return prmsArr; } let table = [ { type: "pf", }, { type: "tr", }, ]; makeTable(table).forEach(prms => prms.then(()=>console.log("Success!")).catch(err=>console.log(err)));