.then的结果在.then之后未定义

时间:2019-04-16 18:52:39

标签: angular ionic-framework ionic4

我正在加载.json文件,将其保存到数组中并编辑一下数组。不幸的是,我是angular的新手,我不知道如何在Ionic4(Angular 7.2.2)中处理异步请求(以前仅在php和客户端js中开发)。

我的json文件的加载按预期工作。但是,如果我想通过循环来编辑文件,我认为在循环结束之前我的诺言就得到了解决。这是我的代码。显示输出的注释。我究竟做错了什么?您能推荐一些东西来更好地学习异步请求吗?

public getCategories()
    {
        let arrCategories;
        return new Promise((resolve, reject) =>
        {
            this.getCategoriesData().subscribe(arrResult =>
                {
                    console.log('Ln 32');
                    console.log(JSON.stringify(arrResult)); // Expected array
                    this.setAbkuerzungenDEAndBild(arrResult).then(arrKategorien =>
                        {
                            console.log('Ln 35');
                            console.log(JSON.stringify(arrKategorien)); // Output: []
                            resolve(arrKategorien);
                        },
                        error =>
                        {
                            reject('Failed loading Categories. [1]');
                        }
                    );
                },
                error =>
                {
                    reject('Failed loading Categories. [2]');
                }
            );
        });
    }


    private getCategoriesData() //Working as expected
    {
        const strUrl = 'assets/data/Kategorien.json';
        return this.objHttp.get(strUrl).pipe(
            map((res: Response) => res),
            catchError(CategoriesService.handleError)
        );
    }

    private setAbkuerzungenDEAndBild(arrCategories) //Returning [] after .then and  later on the array as expected
    {
        let arrNewCategories = [];
        return new Promise((resolve, reject) =>
        {
            this.objStorage.get('objSprache').then(async objSprache =>
            {
                await arrCategories.forEach((objKategorie, intIndex) =>
                {
                    if (objKategorie.intFKSpracheID === objSprache.intSpracheID) //Wenn Sprache == ausgewählt
                    {
                        //set something
                        if (objKategorie.intFKSpracheID !== '1') //Sprache nicht de
                        {
                            for (let objKategorieDE of arrCategories)
                            {
                               //Set something
                            }
                        }
                    }
                });
            });
            resolve(arrNewCategories);
        });
    }
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.7.2/angular.min.js"></script>

1 个答案:

答案 0 :(得分:0)

我使用以下变通办法解决了自己的错误: 我将我的resolve()替换为

 if(intIndex == arrCategories.length-1)
 {
    resolve(arrNewCategories);
 }