实现对 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);
});
我是异步编程的新手,我只是熟悉用 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);
});