2015-10-15 180 views
0

我知道这是一个简单的,愚蠢的问题,但它已经两天了,因为我卡住了它。如何等待'for'循环返回

考虑是有功能的,从某些对象类型UnsafeCourse管理对象类型Course的创作,就像这样:

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中以异步方式工作,为循环不见了通。

我尝试了与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 S'

它是否会造成沉重的开销?

+0

等待,你'从'.forEach'回调中return'ing?看起来即使你的原始代码不能像预期的那样工作。 *假设*会发生什么? – Bergi

+0

@Bergi其实我把它的目的是说明它是如何在这样的同步平台(代码是从Swift语言翻译过来的) – Leviathlon

+1

[使用'new Promise'](http:// stackoverflow。 com/q/23803743/1048572)。 – Bergi

回答

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, []); 
} 
+0

你用'=>'箭头做了什么? – Leviathlon

+0

这被称为Arrorw函数,并与EcmaScript 6一起引入。我用“正常”函数更新了示例。 – PatrickD

+0

请问您可以添加前者,我也想学习新的语法。 – Leviathlon