实现对 return 两个承诺中较慢者的承诺

implement a promise to return the slower of two promises

我是异步编程的新手,我只是熟悉用 promises 代替回调的想法。 我正在尝试实现一个函数(promise)来接受另外两个 promise,只有当两个 promise 都完成时,这将 return 花费更长时间才能完成的 promise 的值。 所以基本上我的想法是使用 Date.now() 函数来计算执行一个承诺所花费的时间,但我很难把它写下来,尤其是一个接受另外两个承诺的承诺(如果这甚至是可能的),这是我的尝试:

var p1 = new Promise((resolve, reject) => {
let start = Date.now();
setTimeout(() => 
   resolve(
     {
       id: 0,
       time: Date.now() - start,
       value: 4+3
     }
           ), 500);
})

var p2 = new Promise((resolve, reject) => {
  let start = Date.now();

  setTimeout(() => 
    reject(
      {
        id: 1,
        time: Date.now() - start,
        value: 7+3
      }
          ), 800);
})

这只是一个想法,承诺 p1、p2 应该作为承诺 'slower' 的参数给出,我对 Date.now() 所做的事情应该以某种方式包含在调用中这些承诺,然后我希望计算两个承诺的运行时间,然后 return 较慢的承诺的值。 关于如何实现这个的任何想法?谢谢。

这里有一个关于如何做到这一点的想法。我没有使用时间戳,而是使用了 cntr。最后一个(最慢的)将被标记为 cntr === 0 所以当它们全部完成时,我们就可以确定标记为 0 cntr 和 return 的那个是 val。

function promiseSlowAll(arrayOfPromises) {
    let cntr = arrayOfPromises.length - 1;
    let newPromises = arrayOfPromises.map(p => {
        return p.then(val => {
            // wrap the results in an object along with a cntr
            return {val: val, cntr: cntr--};
        });
    });
    return Promise.all(newPromises).then(allResults => {
        const lastResult = allResults.find(item => item.cntr === 0);
        // resolve with a single result from the last promise to finish
        return lastResult.val;
    });
}

因此,您使用一组承诺调用 promiseSlowAll(),您会返回一个已解决的值,该值对应于最慢的承诺解决。

这是一个工作演示:

function promiseSlowAll(arrayOfPromises) {
    let cntr = arrayOfPromises.length - 1;
    let newPromises = arrayOfPromises.map(p => {
        return p.then(val => {
            // wrap the results in an object along with a cntr
            return {val: val, cntr: cntr--};
        });
    });
    return Promise.all(newPromises).then(allResults => {
        const lastResult = allResults.find(item => item.cntr === 0);
        return lastResult.val;
    });
}

function delay(t, v) {
    return new Promise(resolve => {
        setTimeout(resolve, t, v);
    });
}

promiseSlowAll([delay(200, "200"), delay(300, "300"), delay(100, "100")]).then(r => {
    console.log("slowest is", r);
});