0

我是异步编程的新手,我只是熟悉用 Promise 代替回调的想法。我正在尝试实现一个函数(promise)来接受另外两个promise,并且只有在两个promise 都完成的情况下才会返回一个需要更长时间才能完成的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);
})

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

4

1 回答 1

2

这是如何做到这一点的一个想法。而不是时间戳,我只使用了cntr. 最后一个(最慢的)将被标记,cntr === 0所以当它们都完成后,我们就可以对带有0cntr 标记的那个进行处理并返回它的 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()使用一组 promise 进行调用,然后返回一个已解析的值,该值对应于解析最慢的 promise。

这是一个工作演示:

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

于 2020-06-13T22:29:34.157 回答