简体   繁体   English

Promise 返回不一致 React Native

[英]Promise return is inconsistent React Native

I am using a library that calls an API, and I am waiting for Promise return to receive an Array.我正在使用一个调用 API 的库,我正在等待 Promise 返回接收数组。 However, even though I expect 2 elements in ActivityItem array, sometimes I receive only first of them (the one that appears first (Item1). From my point of view, I implemented the Promise incorrectly and there should be a mistake in the way I return them, but I miss seeing it. Here I call the function that uses that should return Promise:但是,即使我期望 ActivityItem 数组中有 2 个元素,有时我只收到其中的第一个(第一个出现的那个(Item1)。从我的角度来看,我错误地实现了 Promise,我的方式应该有错误退回它们,但我想念它。在这里我调用 function 使用它应该返回 Promise:

 componentDidMount() {
    this.getDataFromKit(ONEDAYINTERVAL).then(result => {
    this.sendDataToServer(result); //sending to backend
    }).catch(e => console.error);
}

And here is a method itself:这是一个方法本身:

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

The main issue here is I guess: how can I return multiple promises from this one method?我猜这里的主要问题是:我怎样才能从这个方法中返回多个承诺?

The problem as I see it, is your second block of code doesn't get run because you are resolving the promise in the first block.我看到的问题是您的第二个代码块没有运行,因为您正在解决第一个块中的 promise。 The way you have it coded, you will want to resolve that promise only once all your async operations have completed.按照您的编码方式,您需要在所有异步操作完成后才解决 promise。 I modified your code, but have not tested it.我修改了您的代码,但尚未对其进行测试。 It may need to add the .then method to make sure the async data is returned before resolving the initial promise.它可能需要添加.then方法以确保在解析初始 promise 之前返回异步数据。

What happens if you try this?如果你尝试这个会发生什么?

UPDATE更新

It looks like the below code solved your problem as you accepted my answer.当您接受我的回答时,下面的代码似乎解决了您的问题。 However, I did re-write it before I realized you accepted so I will add the new updated code in case that will help you or someone else.但是,在我意识到你接受之前我确实重写了它,所以我会添加新的更新代码,以防万一对你或其他人有所帮助。

Original Answer原始答案

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

Updated Code using Promise.all使用 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);

            });    
    });
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM