如何用foreach循环的结果异步调用函数

How to asynchronous call function with the result of foreach loop

我有一个函数可以遍历一组对象并根据某些参数构建一个对象。它应该 return 构建对象 它代表我将设置的组件的状态对象。但是,我想使用 Array.foreach 但我不知道如何在 foreach 循环完成后调用该函数。

函数看起来像这样:

 buildStateObject= (someArray: Array) => {
    let stateobject= {};
    someArray.foreach(item => {
      switch (item.Someparameter) {
        case 1:
          stateobject.someProp1= item.message;
          break;
        case 2:
          stateobject.someProp2= item.message;
          break;
        // code omitted
      }

    });
     return stateobject;
  };

在我的组件中,我有类似这样的东西,但显然不起作用:

if(someJson.jsonArray)
    this.setState(this.buildStateObject(someJson));

所以我正在寻找的是这样的东西:


Promise.all(buildStateObject).
  then((theResultObjectMaybe)=>{this.setState(theResultObjectMaybe);})

我试图弄清楚这一点,但我做不到。我也不确定这是否是一个好的做法。

[编辑]

@PaulJanicki 感谢您指出错误。只有类型错误。但是,您指出的一个错误也在我的代码中导致 Unhandled promise rejection,我认为这是因为 forEach 是异步的,结果尚未处理。

问题是类型错误 foreach 而不是正确的 forEach

您在 buildStateObject 函数中的 forEach 方法之外缺少 return 语句。另外 forEach 应该是驼峰式。

 function buildStateObject(someArray) {
  let stateobject = {};
  someArray.forEach(item => {
    switch (item.someparameter) {
      case 1:
        stateobject.someProp= item.message;
        break;
      case 2:
        stateobject.someProp= item.message;
        break;
      // code omitted
    }
  });
  
  return stateobject;
}

function setState(state) {
  console.log(state);
}

var someJson = [{
  message: 'first',
  someparameter: 1
}, {
  message: 'second',
  someparameter: 2
}]

setState(buildStateObject(someJson))

还要考虑到 stateobject.someProp 将在每次循环执行时被覆盖,不确定这是否是预期的行为。