如何等待'for'循环返回

时间:2015-10-15 18:28:56

标签: javascript node.js promise

我知道这是一个简单而愚蠢的问题,但是自从我被困在它上面已经有两天了。

考虑有一个函数,从某个对象类型Course管理对象类型UnsafeCourse的创建,如下所示:

Class Schedule {
    constructor() {
        this.courses = [];
    }

    sectionNeedsCourse(unsafeCourse) {
        this.courses.forEach(function (course, index, array) {
            if (course.couldBeRepresentedBy(unsafeCourse)) {
                return course;
            }
        }

        return new Course(unsafeCourse, [some additional parameters...]);
    }
}

正如 node.js 中的内容异步工作一样,for循环也是如此。

我尝试了Promise s的不同方法,但没有用。

sectionNeedsCourse(unsafeCourse) {  //->  Promise
    return new Promise (function (resolve) {
        new Promise(function (resolve) {
            this.courses.forEach(function (course, index, array) {
                if (course.couldBeRepresentedBy(unsafeCourse)) {
                    resolve(eachCourse);
                }
            });

            resolve(null);
        }).then(function (result) {
            console.log(result);
            if (result != null) {
                addCourse(unsafeCourse).then(function (result) {
                    resolve(result);
                });
            } else {
                resolve(result);
            }
        });
    });
}

另外,在同一个函数中使用多个Promise是一个好习惯吗?

是否会产生沉重的开销?

1 个答案:

答案 0 :(得分:2)

我在第一个例子中看不到任何异步方法。 Array.forEach不是异步函数。 您只需在forEach的回调中返回课程,但必须直接在sectionNeedsCourse中返回:

sectionNeedsCourse(unsafeCourse) {
    var course = this.courses.find(function(course){
      course.couldBeRepresentedBy(unsafeCourse) ? course : false;      
    });
    return course ? course : new Course(unsafeCourse, []);
}

如您所见,我也使用find而不是forEach,因为这是您需要的逻辑。

这里要求使用Arrow function

稍微缩短相同的示例
sectionNeedsCourse(unsafeCourse) {
    var course = this.courses.find(course => {
      course.couldBeRepresentedBy(unsafeCourse) ? course : false;      
    });
    return course ? course : new Course(unsafeCourse, []);
}