Hola hay alguna solución para ordenar promesas por tiempo de ejecución? para ex
Promise.all([Promise // 5ms ,Promise // 3ms,Promise // 2ms])devolverá la respuesta con el mismo orden en que se dio. ¿Hay alguna solución o método para ordenarlo por tiempo de ejecución para que tenga un retorno similar?
Promise.all([Promise // 2ms ,Promise // 3ms,Promise // 5ms])Para volver a plantear el problema claramente: dado un conjunto de promesas, ¿pueden ejecutarse simultáneamente y pueden organizarse los resultados en una matriz en orden de tiempo de ejecución?
Si el tiempo de ejecución se conoce de antemano, ordene las promesas por tiempo de ejecución y pase la matriz ordenada a Promise.all() .
Si los tiempos de ejecución se desconocen de antemano, sugeriría envolver las promesas con una pequeña función que cronometra la ejecución. Ordene el resultado de Promise.all() en esos tiempos transcurridos...
function sortedPromiseAll(array) { const start = new Date() const instrumentPromise = p => { return p.then(result => { const now = new Date(); return { result, duration: now.getTime()-start.getTime() } }); } const instrumentedPromises = array.map(instrumentPromise) return Promise.all(instrumentedPromises).then(results => { return results.sort((a, b) => a.duration-b.duration).map(r => r.result); }) } const timedPromise = t => { return new Promise(resolve => { setTimeout(resolve, t) }) }; // imagine we don't know these timings const promiseA = timedPromise(600).then(() => 'A'); const promiseB = timedPromise(300).then(() => 'B'); const promiseC = timedPromise(900).then(() => 'C'); // expected result is B, A, C sortedPromiseAll([promiseA, promiseB, promiseC]) .then(result => console.log(result));Puede obtener el orden de cuándo se resuelven si inserta manualmente los resultados de cada promesa en una matriz. En este ejemplo, el valor resuelto es una cadena que muestra la marca de tiempo en que se agregó.
Los resultados se envían a la matriz de outputs cuando se resuelven. Los outputs de impresión muestran que ahora están ordenados en función de cuándo se resolvieron.
const outputs = []; function createPromise() { return new Promise((resolve, reject) => { // adding a bit of randomness here so there is no guarantee when they resolve const delay = Math.random() * 1000; setTimeout(() => { resolve(`Promise resolved at ${Date.now()}`); }, delay); }); } function addResult() { return createPromise().then(value => { outputs.push(value); }); } Promise.all([addResult(), addResult()]).then(() => console.log(outputs));La forma más fácil es empujarlos a una nueva matriz a medida que ingresan. No es necesario crear promesas adicionales, solo tiene que aprovechar la promesa que ya se creó.
const getRandomPromise = () => { return new Promise(resolve => { var ms = Math.random() * 3000; window.setTimeout(()=>resolve(ms), ms); }); }; function orderPromises (promises) { const orderedPromies = []; const pushPromiseResults = promise => promise.then(result => (orderedPromies.push(result), result)) promises.forEach(pushPromiseResults); return Promise.all(promises).then(()=>orderedPromies); } const myPromises = [getRandomPromise(), getRandomPromise(), getRandomPromise()]; orderPromises(myPromises).then(x => console.log(x));