按执行时间排序承诺

Ordering promis by execution time

你好,请问有什么按执行时间排序promise的解决方案吗?对于前

Promise.all([Promise // 5ms ,Promise // 3ms,Promise // 2ms])

会 return 以与给定的顺序相同的顺序回答是否有任何解决方案或方法可以按执行时间对其进行排序以使 return 喜欢?

Promise.all([Promise // 2ms ,Promise // 3ms,Promise // 5ms])

如果您手动将每个 promise 的结果推送到一个数组中,您可以获得它们解析时的顺序。在此示例中,已解析的值是一个字符串,显示添加它的时间戳。

结果在解析时被推入 outputs 数组。打印 outputs 显示它们现在根据它们解决的时间排序。

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));

再说清楚问题:给定一组promise,是否可以并发执行,是否可以将结果按照执行时间的顺序排列成数组?

如果预先知道执行时间,则按执行时间对promise进行排序,并将排序后的数组传递给Promise.all()

如果事先不知道执行时间,我建议用一个计算执行时间的小函数来包装承诺。根据经过的时间对 Promise.all() 的结果进行排序...

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));

最简单的方法是在它们进入时将它们推送到一个新数组。无需创建额外的承诺,只需搭载已经创建的承诺。

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));