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

时间:2019-10-15 11:05:43

标签: javascript es6-promise

我有一个函数,该函数遍历对象数组并根据一些参数构建对象。它应该返回构建对象 代表我将要设置的组件的状态对象。但是,我想使用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,而我认为这是因为forEac h是异步的,并且尚未处理结果。

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

1 个答案:

答案 0 :(得分:1)

buildStateObject函数中,forEach方法之外的return语句丢失了。另外forEach应该是camelCase。

 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将在每次循环执行时被覆盖,不确定是否是预期的行为。