Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 解决承诺时如何维持秩序(承诺.全部解决)?_Javascript_Asynchronous_Promise - Fatal编程技术网

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