我目前正在阅读Angular教程并遇到以下代码:
getHero(id: number): Promise<Hero> {
return this.getHeroes().then( heroes => heroes.find( hero => hero.id === id ));
}
出于好奇,我决定使用普通函数重写回调函数:
getHero(id: number): Promise<Hero> {
return this.getHeroes().then( heroes => heroes.find( this.findHero, id));
}
findHero(hero: Hero, index: number, array: Hero[]): boolean {
if(hero.id === this.id){
return true;
}else{
return false;
}
}
但是这给了我错误Property 'id' does not exist on type 'HeroService'.
我如何引用传递给我的回调函数的id
参数?
答案 0 :(得分:2)
id
(数字)属性被定义为函数getHero
的参数,因此在函数findHero
中不可用。您尝试使用this.id
,但编译器告诉您此类属性不会在您的班级HeroService
中退出,这当然是正确的,就像您希望将该属性作为服务的一部分一样那么你必须在你的getHero
方法中做这样的事情。
getHero(id: number, ...etc) {
this.id = id;
// etc.
}
然而,这会给你带来另一个问题:因为你的方法getHeroes
似乎是异步代码(我可以告诉它因为它返回Promise
)这种方法会让你头痛并发问题您的方法getHero
从应用程序的不同部分调用两次(或更多次)。第一次getHero
调用会将this.id
设置为x
,但与此同时,在运行异步代码时,对getHero
的另一次调用会将其设置为y
,使回调findHero
响应第一个调用而运行id
时使用的值不正确(具体而言,它会将y
读为this.id
的值)。
所以......长话短说。您可能希望了解有关CLOSURES的更多信息以及它们对JavaScript如此重要的原因。简短回答你的问题,请使用:
getHero(id: number): Promise<Hero> {
return this.getHeroes().then( heroes => heroes.find(this.findHero.bind(this, id));
}
并将您的回调findHero
定义为
findHero(idToFind: number, hero: Hero, index, array: Hero[]) {
return hero.id === idToFind;
}
您需要这个的原因是this
不会自动传递给您用作其他函数(或方法,如本例中)的参数的函数。因此,使用bind
显式绑定此类函数的this
,以便在this
中使用findHero
时,它指向正确的对象。 bind
的第二个参数是将id
绑定到函数findHero
的每次调用,这样无论何时调用bind
返回的函数,它都会发生两次事情:
this
绑定到HeroService
。 只是一个小注意......你正在使用TypeScript,因此this
中的bind
参数毫无意义,因为TypeScript会自动将类中的所有方法绑定到当前实例,但是你需要在这种情况下,因为您还想绑定第二个参数(id
来查找)。
我希望我帮助过。