Возврат обещания несовместим с React Native - PullRequest
1 голос
/ 07 мая 2020

Я использую библиотеку, которая вызывает API, и жду возврата Promise для получения массива. Однако, несмотря на то, что я ожидаю 2 элемента в массиве ActivityItem, иногда я получаю только первый из них (тот, который появляется первым (Item1). С моей точки зрения, я реализовал Promise неправильно, и должна быть ошибка в том, как я вернуть их, но я не вижу этого. Здесь я вызываю функцию, которая должна возвращать 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 Ответ

0 голосов
/ 07 мая 2020

Проблема, на мой взгляд, в том, что ваш второй блок кода не запускается, потому что вы выполняете обещание в первом блоке. Как вы это закодировали, вы захотите выполнить это обещание только после того, как все ваши операции asyn c будут завершены. Я изменил ваш код, но не тестировал его. Может потребоваться добавить метод .then, чтобы убедиться, что данные asyn c возвращаются перед выполнением начального обещания.

Что произойдет, если вы попробуете это сделать?

ОБНОВЛЕНИЕ

Похоже, что приведенный ниже код решил вашу проблему, поскольку вы приняли мой ответ. Однако я переписал его, прежде чем понял, что вы приняли, поэтому я добавлю новый обновленный код на случай, если он поможет вам или кому-то еще.

Исходный ответ

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);

            });    
    });
}
...