嵌套促销,不等待结果

Nested promoses, not waiting for the result

我有一个 getProgrammeWrapper 方法 returns 一个承诺。然而,在 .then 方法中,我几乎没有其他希望在返回 programmeWrapper[]

之前执行的承诺

这是service.ts

我正在调用服务 ngOnInit

this.service.getProgrammesByWrapper().then(((res) => {
            this.programmes = res;
            this.result.updateInfo("Sorting classes...")
            this.programmes =this.programmes.sort((a,b) => {
                return b.programme.click - a.programme.click;
            });
            this.result.updateSuccess(true);
        }));

希望我已经把问题解释清楚了。我试过使用 await,但它没有按预期工作。

getProgrammeWrapper()

getProgrammesByWrapper(): Promise<ProgrammeWrapper[]> {
        var current = this;
        var programmesDTO = new Array<ProgrammeWrapper>();
        var table = this.client.getTable("programme");
        return new Promise((resolve, reject) => {
            table.read()
                .then(function (modules) {
                    modules.forEach(element => {
                        var newProgDTO = new ProgrammeWrapper(element);
                        current.getLessonsByProgrammeId(element.id).then(lessons => newProgDTO.lesson = lessons).catch(err => console.log(err));
                        current.getUser(element.tutorId).then(user => newProgDTO.tutor = user).catch(err => console.log(err));
                        programmesDTO.push(newProgDTO)
                    });
                    resolve(programmesDTO)
                }, function (error) { reject(error) });
        });
    }

我不确定它是否有效,也可能有错误。试试这个:

getProgrammesByWrapper(): Promise<ProgrammeWrapper[]> {
    var current = this;
    var programmesDTO = new Array<ProgrammeWrapper>();
    var table = this.client.getTable("programme");

    return new Promise((resolve, reject) => {
        table.read()
        .then(function (modules) {
            let promises = new Array<Promise<any>>();

            modules.forEach(element => {
                var newProgDTO = new ProgrammeWrapper(element);

                let promise = current.getLessonsByProgrammeId(element.id)
                .then(lessons => newProgDTO.lesson = lessons)
                .catch(err => console.log(err));

                promises.push(promise);

                promise = current.getUser(element.tutorId)
                .then(user => newProgDTO.tutor = user)
                .catch(err => console.log(err));

                promises.push(promise);
                programmesDTO.push(newProgDTO)
            });

            // Wait for all promises to be ready before resolving
            Promise.all(promises).then(function() {
                resolve(programmesDTO);
            });
        }, function (error) { reject(error); });
    });
}