嵌套的承诺,而不是等待结果

时间:2017-06-29 16:24:02

标签: angular-promise

我有一个返回承诺的getProgrammeWrapper方法。但是在.then方法中,在返回programmeWrapper[]

之前我还没有其他承诺可以执行

这是service.ts enter image description here

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

1 个答案:

答案 0 :(得分:1)

我不确定它会起作用,也可能有错误。试试这个:

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); });
    });
}
相关问题