Una pregunta hecha aquí antes, con exactamente el mismo título que esta, fue respondida con un "No deberías usar eso, usa esto en su lugar", estoy buscando saber qué hace, no qué más podría hacer, se trata de entender no es un simple copiar y pegar.
Mi pregunta es bastante simple, ¿cuál es la diferencia entre estos tres enfoques al crear una promesa?
const API = (item, fail) => new Promise((resolve, reject) => { if (fail) reject(item + ' ...with an error'); setTimeout(() => resolve(item), 1000); }); (async () => { const pro1 = Promise.resolve(API('I am inside resolve')); const pro2 = Promise.resolve(API('I am inside resolve', true)); const pro3 = Promise.resolve().then(() => API('I am thenable')); const pro4 = Promise.resolve().then(() => API('I am thenable', true)); const pro5 = new Promise((resolve) => resolve(API('I am a new promise'))); const pro6 = new Promise((resolve) => resolve(API('I am a new promise', true))); const store = [pro1, pro2, pro3, pro4, pro5, pro6]; const results = await Promise.allSettled(store); for (const { status, value, reason } of results) { if (status === 'fulfilled') console.log(value) else console.log(reason) } })();La diferencia está en el trabajo a realizar. Si bien todos estos métodos son válidos, tienen diferentes costos y previsibilidad.
Promise.resolve() produce una única instancia de Promise resuelta y, según el valor proporcionado al motor JS de la llamada, tiene información para optimizarla. Hace que todo el trabajo se realice en una sola llamada al código subyacente del motor JS (normalmente C++, pero podría ser Java o WASM). Así que siempre es la mejor opción.Promise.resolve().then(() => API(/*...*/)) Produce varias instancias de Promise: una en Promise.resolve() y otra en la llamada .then() . También asigna más memoria y realiza varios (3 o más) saltos redundantes entre JS y el motor. Es difícilmente optimizable y requiere que se realice una heurística intensiva para averiguar si esta llamada es optimizable. Es la peor opción.new Promise((resolve) => resolve(API(/* ... */)) asigna una función y una instancia de Promise y realiza dos saltos entre JS y el motor. Es más difícil optimizar esta llamada, debido a la naturaleza de JS .Promise.resolve().then() En sus ejemplos, el then() no hace ninguna diferencia ya que solo resuelve la promesa y obtiene sus datos.
then() se usa típicamente para encadenar promesas, tome esto como ejemplo:
Promise.resolve('foo') // 1. Receive "foo", concatenate "bar" to it, and resolve that to the next then .then(function(string) { return new Promise(function(resolve, reject) { setTimeout(function() { string += 'bar'; resolve(string); }, 1); }); }) // 2. receive "foobar", register a callback function to work on that string // and print it to the console, but not before returning the unworked on // string to the next then .then(function(string) { setTimeout(function() { string += 'baz'; console.log(string); // foobarbaz }, 1) return string; }) Aquí encadenamos múltiples promesas then() a partir de una promesa previamente resuelta, mientras mantenemos los datos originales de la primera resolución, aunque en este caso lo modificamos con cada nueva promesa.
Puedes leer más sobre promesas y encadenamientos aquí .