Javascript 处理来自本机的多个响应

Javascript 处理来自本机的多个响应,javascript,reactjs,react-native,asynchronous,promise,Javascript,Reactjs,React Native,Asynchronous,Promise,我有几个函数返回承诺响应。我现在正试图抓取所有数据并将所有数据发送到后端。然而,我不知道如何抓住它们。我喜欢这样: componentDidMount() { Promise.all([ this.getFunction1Data(ONEDAYINTERVAL), //returns an array of objects this.getFunction2Data(ONEDAYINTERVAL), this.getFunction3

我有几个函数返回承诺响应。我现在正试图抓取所有数据并将所有数据发送到后端。然而,我不知道如何抓住它们。我喜欢这样:

   componentDidMount() {
    Promise.all([
        this.getFunction1Data(ONEDAYINTERVAL), //returns an array of objects
        this.getFunction2Data(ONEDAYINTERVAL),
        this.getFunction3Data(ONEDAYINTERVAL),

    ]).then(([response1, response2, response3]) => {
        this.sendDataToServer(response3);
        // do stuff with your data
    }).catch(e => console.error);

}
但这里的问题是,不知何故,它们都是混合的

示例:有时repons2包含来自所有三个函数的数据,有时response3包含所需的所有数据,而response2缺少一些对象。我该如何解决这个问题?是否应该有一些函数从所有响应中形成一个数组(检查元素是否存在),或者有一种解决方法? 为了再次检查,我在这里添加了一个函数示例(其他函数相同):

更新 第二个功能:

  getFucntion2Data(dateFrom) {

    return new Promise((resolve) => {
        AppleKit.initKit(KitPermissions.uploadBasicKitData(), (err, results) => {
            if (err) {
                return;
            }

            AppleHealthKit.getStepsSample(datefrom, (err, results) => {
                if (err) {
                    return resolve([]);
                }
                const newData = results.map(item => {
                    return { ...item, name: "StepsSample" };
                });
                this.setState(({ActivityItem}) => {
                    ActivityItem = [...ActivityItem, ...newData];
                    resolve(ActivityItem);
                    return { newData }
                });
            });
        })
    })
}

主要问题在
getFunction1Data
中:

 const allData = [...this.state.ActivityItem, ...newData];
 this.setState({ ActivityItem: allData });
您正在基于现有状态设置状态。无论何时执行此操作,都需要使用
setState
的回调表单,而不是直接传递状态的表单。原因是,在渲染之间进行多次更改时,和会“成批”进行。因此,当您构建要提供给
设置状态的新状态时,
this.state.ActivityItem
可能会过期

要使用回调表单,根本不需要
allData
,请执行以下操作:

 this.setState(({ActivityItem}) => {
     ActivityItem = [...ActivityItem, ...newData];
     resolve(ActivityItem);
     return { ActivityItem }
 });

另一个问题是,每次调用
getFunction1Data
都返回(通过promise)收集的所有数据,而不仅仅是该调用收集的数据。我不完全清楚您想要做什么,但我倾向于让
getFunction1Data
只返回它收集的数据(
newData
),而不是所有的数据,或者修改它,使它得到您想要得到的所有信息,而不仅仅是三分之一,这样您就可以调用它一次。

Wow,非常感谢您的回复。我终于明白了,当我只返回新数据时,所有的响应都开始完全符合我的需要。请再问一个问题,你能告诉我如何将这三个函数合并为一个吗?它们之间的唯一区别在于不同的方法调用(而不是getSamples)。我可以用它来更新问题。我已经尝试了几种方法,但不知道如何解决/返回该问题中的数据case@VladDemyan-对不起,我没有注意到它们是不同的函数。:-)所以唯一的区别是
AppleKit.getSamples
AppleHealthKit.getstepsample
与第三个使用的东西相比?您可以将它们作为参数传递:
getFunctionData(AppleKit.getSamples,ONEDAYINTERVAL)
然后
function getFunctionData(fn,dateFrom)
并在函数中使用
fn
。如果您在
getSamples
getstepsample
期间由于
this
错误而得到错误,您应该将
bind
添加到调用中:
getFunctionData(AppleKit.getSamples.bind(AppleKit),onedaytimval)
。工作正常,感谢您的帮助!
 this.setState(({ActivityItem}) => {
     ActivityItem = [...ActivityItem, ...newData];
     resolve(ActivityItem);
     return { ActivityItem }
 });