亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 103 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號