为了账号安全,请及时绑定邮箱和手机立即绑定

Promise return is inconsistent React Native

Promise return is inconsistent React Native

红颜莎娜 2022-08-04 15:49:54
我正在使用一个调用API的库,我正在等待Promise返回接收数组。但是,即使我期望在 ActivityItem 数组中有 2 个元素,有时我只收到其中的第一个元素(首先出现的元素 (Item1)。从我的角度来看,我错误地实现了承诺,我返回它们的方式应该有错误,但我错过了看到它。在这里,我调用应该返回 Promise 的函数: componentDidMount() {    this.getDataFromKit(ONEDAYINTERVAL).then(result => {    this.sendDataToServer(result); //sending to backend    }).catch(e => console.error);}这是一个方法本身:getDataFromKit(dateFrom) {    return new Promise((resolve) => {    AppleKit.initKit(KitPermissions.uploadBasicKitData(), (err, results) => {        if (err) {            return;        }    AppleKit.getSamples(dateFrom, (err, results) => {                if (err) {                    return resolve([]);                }                const newData = results.map(item => {                    return { ...item, name: "Item1" };                });                const allData = [...this.state.ActivityItem, ...newData];                this.setState({ ActivityItem: allData });                resolve(allData);            });        // if I delete the code below it will work just fine always grabbing only one item.        new Promise((resolve) => {         AppleKit.getSamplesSecondMethod(dateFrom, (err, results) => {            if (err) {                return resolve([]);            }            const newData = results.map(item => {                return { ...item, name: "Item2" };            });            const allData = [...this.state.ActivityItem, ...newData];            this.setState({ ActivityItem: allData });            resolve(allData);             });           });        });     })}这里的主要问题是我猜:我如何从这一个方法返回多个承诺?
查看完整描述

1 回答

?
慕姐4208626

TA贡献1852条经验 获得超7个赞

在我看来,问题是你的第二个代码块没有运行,因为你正在解决第一个代码块中的承诺。按照编码的方式,只有在完成所有异步操作后,您才需要解析该承诺。我修改了您的代码,但尚未对其进行测试。它可能需要添加该方法以确保在解析初始承诺之前返回异步数据。.then


如果你试试这个会发生什么?


更新


看起来下面的代码解决了你的问题,因为你接受了我的答案。但是,在我意识到您接受之前,我确实重写了它,因此我将添加新的更新代码,以防对您或其他人有所帮助。


原始答案


getDataFromKit(dateFrom) {


    const thenable = new Promise((resolve) => {

            AppleKit.initKit(KitPermissions.uploadBasicKitData(), (err, results) => {

                if (err) {

                    return;

                }



                AppleKit.getSamples(dateFrom, (err, results) => {

                    if (err) {

                        return resolve([]);

                    }

                    const newData = results.map(item => {

                        return {

                            ...item,

                            name: "Item1"

                        };

                    });


                    resolve(newData);


                });

            });

        })

        .then((newData) => {


            AppleKit.initKit(KitPermissions.uploadBasicKitData(), (err, results) => {

                if (err) {

                    return;

                }



                AppleKit.getSamplesSecondMethod(dateFrom, (err, results) => {

                    if (err) {

                        return;

                    }


                    var stateData = this.state.ActivityItem;


                    const addData = results.map(item => {

                        return {

                            ...item,

                            name: "Item2"

                        };

                    });

                    stateData = [...stateData, ...newData];

                    stateData = [...stateData, ...addData];


                    this.setState({

                        ActivityItem: stateData

                    });


                });



            });

        });

    return thenable;

}

使用 Promise.all 更新了代码


getDataFromKit(dateFrom) {


    return new Promise((resolve) => {


        const promise1 = new Promise((resolve) => {

            AppleKit.initKit(KitPermissions.uploadBasicKitData(), (err, results) => {

                if (err) {

                    return Promise.reject(err);

                }



                AppleKit.getSamples(dateFrom, (err, results) => {

                    if (err) {

                        return Promise.reject(err);

                    }

                    const newData = results.map(item => {

                        return {

                            ...item,

                            name: "Item1"

                        };

                    });


                    return Promise.resolve(newData);


                });

            });

        });


        const promise2 = new Promise((resolve) => {


            AppleKit.initKit(KitPermissions.uploadBasicKitData(), (err, results) => {

                if (err) {

                    return Promise.reject(err);

                }



                AppleKit.getSamplesSecondMethod(dateFrom, (err, results) => {

                    if (err) {

                        return Promise.reject(err);

                    }


                    const moreData = results.map(item => {

                        return {

                            ...item,

                            name: "Item2"

                        };

                    });


                    return Promise.resolve(moreData);

                });

            });

        });



        Promise.all([promise1, promise2])

            .then(([result1, result2]) => {


                var nArrays = [result1, result2, this.state.ActivityItem];


                const finalResult = [].concat(...nArrays);


                return Promise.resolve(finalResult);


            });    

    });

}


查看完整回答
反对 回复 2022-08-04
  • 1 回答
  • 0 关注
  • 87 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信