实现一个承诺以返回两个承诺中较慢的那个



我是异步编程的新手,我只是熟悉承诺作为回调替代品的想法。 我正在尝试实现一个函数(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 应该作为承诺"较慢"的参数给出,我对 Date.now(( 所做的事情应该以某种方式围绕对这些承诺的调用,然后我希望计算两个承诺的运行时间,然后返回较慢的值。 关于如何实现这一点的任何想法?谢谢。

这里有一个关于如何做到这一点的想法。 我没有使用时间戳,我只是使用了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(),然后得到一个与最慢的求解值对应的解析值。

这是一个工作演示:

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

最新更新