如何按照已解决的顺序对承诺进行排序而不关心参数中的顺序
How to sort promises in their resolved order not caring about order in arguments
let P1 = new Promise((res, rej) => {
setTimeout(res("R1"), 2000);
});
let P2 = new Promise((res, rej) => {
setTimeout(res("R2"), 5000);
});
let P3 = new Promise((res, rej) => {
setTimeout(res("R3"), 1000);
});
我希望我的函数能够 return promises 以便它们像这样开始:["R3", "R1", "R2"]
function preserveOrder([P1, P2, P3]); // should return ["R3, "R1", "R2"]
function preserveOrder([P2, P3, P1]); // should return ["R3, "R1", "R2"]
我想不出最好的方法是什么? (因为 Promise.all() 会保留顺序)
您可以在 Promise 解析后将其映射到索引,然后对它们使用 Promise.all
并随后按 id:
对它们进行排序
let order = 0;
const result = await Promise.all(
[P1, P2, P3].map(it => it.then(result => ({ result, position: order++ })))
);
result.sort((a, b) => a.position- b.position);
或者可以重新发明 Promise.all
尽管这是我通常会避免的事情...
function PromiseAllOrdered(promises) {
return new Promise((resolve, reject) => {
const values = [];
for(const promise of promises) {
promise.then(
value => {
values.push(value);
if(promises.length === values.length) resolve(values);
},
error => reject(error)
);
}
});
}
您可能正在寻找
async function fulfillmentOrder(promises) {
const results = [];
await Promise.all(promises.map(promise =>
promise.then(value => {
results.push(value);
})
));
return results;
}
let P1 = new Promise((res, rej) => {
setTimeout(res("R1"), 2000);
});
let P2 = new Promise((res, rej) => {
setTimeout(res("R2"), 5000);
});
let P3 = new Promise((res, rej) => {
setTimeout(res("R3"), 1000);
});
我希望我的函数能够 return promises 以便它们像这样开始:["R3", "R1", "R2"]
function preserveOrder([P1, P2, P3]); // should return ["R3, "R1", "R2"]
function preserveOrder([P2, P3, P1]); // should return ["R3, "R1", "R2"]
我想不出最好的方法是什么? (因为 Promise.all() 会保留顺序)
您可以在 Promise 解析后将其映射到索引,然后对它们使用 Promise.all
并随后按 id:
let order = 0;
const result = await Promise.all(
[P1, P2, P3].map(it => it.then(result => ({ result, position: order++ })))
);
result.sort((a, b) => a.position- b.position);
或者可以重新发明 Promise.all
尽管这是我通常会避免的事情...
function PromiseAllOrdered(promises) {
return new Promise((resolve, reject) => {
const values = [];
for(const promise of promises) {
promise.then(
value => {
values.push(value);
if(promises.length === values.length) resolve(values);
},
error => reject(error)
);
}
});
}
您可能正在寻找
async function fulfillmentOrder(promises) {
const results = [];
await Promise.all(promises.map(promise =>
promise.then(value => {
results.push(value);
})
));
return results;
}