Javascript 解决承诺时如何维持秩序(承诺.全部解决)?
此代码对Javascript 解决承诺时如何维持秩序(承诺.全部解决)?,javascript,asynchronous,promise,Javascript,Asynchronous,Promise,此代码对案例中的每个案例id执行GET请求。然后验证每个案例是否已满或存在错误 let cases = [ /* array of case objects having the property CaseId */ ]; let promises = []; // fetch all cases first cases.forEach(c => promises.push(CaseSource.get(c.CaseId))); // validate each case Promis
案例中的每个案例id执行GET请求。然后验证每个案例是否已满或存在错误
let cases = [ /* array of case objects having the property CaseId */ ];
let promises = [];
// fetch all cases first
cases.forEach(c => promises.push(CaseSource.get(c.CaseId)));
// validate each case
Promise.allSettled(promises).then((results) => {
results.forEach((promise) => {
if (promise.status === "fulfilled") {
let fetchedCase = promise.value;
let caseSize = fetchedCase.Evidences.length;
if (caseSize + 1 > MAX_CASE_SIZE) {
fullCases.push(fetchedCase.Title);
} else {
validCases.push(fetchedCase);
}
} else {
let error = promise.reason;
this.loadCaseError(ApiException.parse<IExceptionModel>(error), /* need to use c.CaseId here... */);
}
}); this.loadAllCases(fullCases, validCases);
});
let cases=[/*具有属性CaseId*/]的case对象数组;
让承诺=[];
//先把所有箱子拿来
cases.forEach(c=>promises.push(CaseSource.get(c.CaseId));
//验证每个案例
承诺。所有已解决(承诺)。然后((结果)=>{
结果。forEach((承诺)=>{
如果(承诺状态==“履行”){
让fetchedCase=promise.value;
让caseSize=fetchedCase.defences.length;
如果(案例大小+1>最大案例大小){
fullCases.push(fetchedCase.Title);
}否则{
validCases.push(fetchedCase);
}
}否则{
让错误=承诺。理由;
this.loadCaseError(ApiException.parse(error),/*此处需要使用c.CaseId…*/);
}
});此。加载所有案例(完整案例、有效案例);
});
我想能够有一个有错误的案件案件id。然而,这不是一个承诺中的财产。我不能添加它。ID位于原始案例
数组中
我考虑过跟踪承诺的索引,但是,我不认为承诺在promissions
数组中的解析顺序与执行GET请求的顺序相同(因为异步,所以不保证)
有什么方法可以维持订单吗?承诺的结果。所有/所有结算的
都严格按照插入顺序进行,因此您应该能够通过其索引访问源:
Promise.allSettled(promises).then((results) => {
results.forEach((result, INDEX) => {
if (result.status === "fulfilled") {
....
} else {
let error = promise.reason;
whatever(error, cases[INDEX]);
}
对于更一般的情况,当承诺结算后输入不可用或其顺序未知时,您可以将all
与包装一起使用,作为allSettled
更灵活的替代方案:
Promise.all(
INPUTS.map(input =>
FUNC(input)
.then(result => ({status: 'fulfilled', result, input}))
.catch(reason => ({status: 'rejected', reason, input}))
))
因此,可以将任意有效负载添加到
结果
对象。承诺的结果。所有/所有结算的都严格按照插入顺序,因此您应该能够通过其索引访问源:
Promise.allSettled(promises).then((results) => {
results.forEach((result, INDEX) => {
if (result.status === "fulfilled") {
....
} else {
let error = promise.reason;
whatever(error, cases[INDEX]);
}
对于更一般的情况,当承诺结算后输入不可用或其顺序未知时,您可以将all
与包装一起使用,作为allSettled
更灵活的替代方案:
Promise.all(
INPUTS.map(input =>
FUNC(input)
.then(result => ({status: 'fulfilled', result, input}))
.catch(reason => ({status: 'rejected', reason, input}))
))
因此,可以将任意有效负载添加到
结果
对象。将请求ID映射到一个对象,作为设置成功/失败值的键。如果在结果中添加i
。forEach((promise,i)=>{
,则您可以只执行案例[i]
要获取相应的案例,请在forEach内部。结果由Promise按顺序保存。AllSetted
,无论resolves/Rejects的顺序如何都可以使用map()而不是forEach()以与fed相同的顺序取回承诺数组。@blex因此承诺的顺序将与案例的顺序相同如果事先在forEach
中完成了get请求,并且只有生成的数组被放入allsolited
中,那么allsolited
如何保持顺序是forEach
保持顺序的那一个?@dandavis你的意思是map
保持异步调用的顺序,而不是forEach
?将请求ID映射到一个对象,作为设置成功/失败值的键。如果你在结果中添加i
。forEach((promise,i)=>{
,那么你就可以执行案例[i]
要获取相应的案例,请在forEach内部。结果由Promise按顺序保存。AllSetted
,无论resolves/Rejects的顺序如何都可以使用map()而不是forEach()以与fed相同的顺序取回承诺数组。@blex因此承诺的顺序将与案例的顺序相同如果事先在forEach
中完成了get请求,并且只有生成的数组被放入allsolited
中,那么allsolited
如何保持顺序是forEach
保持顺序的那一个?@dandavis你的意思是map
保持异步调用的顺序,而不是forEach
?