猿问

Promise return is inconsistent React Native

我正在使用一个调用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);

             });

           });

        }); 

    })

}

这里的主要问题是我猜:我如何从这一个方法返回多个承诺?


红颜莎娜
浏览 88回答 1
1回答

慕姐4208626

在我看来,问题是你的第二个代码块没有运行,因为你正在解决第一个代码块中的承诺。按照编码的方式,只有在完成所有异步操作后,您才需要解析该承诺。我修改了您的代码,但尚未对其进行测试。它可能需要添加该方法以确保在解析初始承诺之前返回异步数据。.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);            });        });}
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答