Esto puede parecer una pregunta tonta, pero soy un novato en este tema. En el siguiente guión tengo dos promesas. Por ahora "segundaPromise" ejecutándose primero, y luego ejecutando "firstPromise". Porque en la "segunda promesa" puse menos tiempo. Pero, ¿cómo ejecutar primero "firstPromise", después de terminar eso, comenzar a ejecutar "secondPromise"? Cómo reescribir el guión a continuación
(async function() { //var final = new Array(); var final; const firstPromise = new Promise( function(resolve) { let result = 2 + 2; resolve(result); setTimeout(() => console.log("please show me first"), 2000); }); const secondPromise = new Promise( function(resolve) { let result2 = 0; resolve(result2 + 1); setTimeout(() => console.log("please show me second"), 1000); }); var myP = Promise.all([firstPromise, secondPromise]).then((values) => { return values[0]+values[1]; }); return myP; })(); (async function() { //var final = new Array(); var final; const firstPromise = new Promise( function(resolve) { let result = 2 + 2; resolve(result); setTimeout(() => console.log("please show me first"), 2000); }); const secondPromise = new Promise( function(resolve) { let result2 = 0; resolve(result2 + 1); setTimeout(() => console.log("please show me second"), 1000); }); var myP = Promise.all([firstPromise, secondPromise]).then((values) => { return values[0]+values[1]; }); return myP; })();La respuesta de Quentin es correcta: la función que pasa a new Promise ocurre de inmediato. Sin embargo: debido a que ya tiene esto en una función async , puede await Promesas dentro de ella. Esto detiene la función async hasta que se resuelve Promise, por lo que, a diferencia de su función con Promise.all que espera sus new Promise Promises explícitas en paralelo, mi función espera esas Promises en serie.
Además, si desea que las new Promise que escribió esperen la acción en setTimeout , debe esperar y llamar al método de resolve dentro de la devolución de llamada que llama setTimeout , no fuera de ellos como lo tiene.
console.log("start"); (async function () { const firstValue = await new Promise( // ^^^^^ function (resolve) { let result = 2 + 2; setTimeout(() => { console.log("please show me first"); resolve(result); // Promise resolves after 2000ms }, 2000); }); const secondValue = await new Promise( // ^^^^^ function (resolve) { let result2 = 0; setTimeout(() => { console.log("please show me second"); resolve(result2 + 1); }, 1000); }); // These are values, not promises, because you await them. // However, the async function still returns a Promise, because // "async" covers the asynchronicity of the Promises you await. return firstValue + secondValue; })().then(x => console.log(x)); // or .then(console.log)No puedes ejecutar una promesa.
Puede ejecutar una función.
Si pasa una función a un constructor de Promise, será ejecutada (por el constructor de Promise) inmediatamente.
No hay forma de retrasar la ejecución de una función pasada a un constructor Promise.
Podría envolver sus llamadas a la new Promise en funciones, y luego solo llamar a la segunda función cuando se resuelva la primera promesa.
(Tenga en cuenta, sin embargo, que en sus ejemplos, las llamadas a setTimeout ocurren después de que se llama a la función de resolve ).