Javascript 在函数中传递变量的类型脚本

Javascript 在函数中传递变量的类型脚本,javascript,angular,typescript,angular2-services,Javascript,Angular,Typescript,Angular2 Services,刚开始打字,正试着让我的头脑清醒过来 下面是生成三个随机数的代码,我使用这些随机数从json中选择随机对象 @Injectable() export class TrackService { public drawn :number[]=[]; constructor(private http: Http) { } public getRandomTrack(): Observable<Track[]> { t

刚开始打字,正试着让我的头脑清醒过来

下面是生成三个随机数的代码,我使用这些随机数从json中选择随机对象

    @Injectable()
 export class TrackService {
     public drawn :number[]=[];

     constructor(private http: Http) {


     }
     public getRandomTrack(): Observable<Track[]> {
         this.generateRandomNumbers();
         console.log(this.drawn);  //this.drawn is available here 
         return this.http
         .get(API_ENDPOINT)
         .map(this.extractRandomData);
     }



     public extractRandomData(res: Response) {
         let body = res.json();        
         console.log(this.drawn); //undefined here

         var randomTrack = [];

         for(var i=0;i<this.drawn.length; i++){
             randomTrack.push(body.results[this.drawn[i]]);
         }

         return randomTrack;
     }


     private generateRandomNumbers(){
         var available = [];

         for (var i = 1; i<= 55; i++) {
             available.push(i);
         }

         for (var i = 0; i <3; i++) {
             var random = Math.floor((Math.random() * available.length));
             this.drawn.push(available[random]);
             available.splice(random, 1);
         }

         return this.drawn;
     }
@Injectable()
出口级轨道服务{
公开提款:编号[]=[];
构造函数(专用http:http){
}
public getRandomTrack():可观察{
这个.generateRandomNumbers();
console.log(this.draw);//此处提供this.draw
返回此文件。http
.get(API_端点)
.map(此.map数据);
}
公共数据(res:响应){
让body=res.json();
console.log(this.draw);//此处未定义
var randomTrack=[];

对于(var i=0;i您必须绑定上下文:

 public getRandomTrack(): Observable<Track[]> {
     this.generateRandomNumbers();
     console.log(this.drawn);  //this.drawn is available here 
     return this.http
     .get(API_ENDPOINT)
     .map((v) => { this.extractRandomData(v) });
 }
public getRandomTrack():可观察{
这个.generateRandomNumbers();
console.log(this.draw);//此处提供this.draw
返回此文件。http
.get(API_端点)
.map((v)=>{this.extractRandomData(v)});
}

了解更多详细信息。

我在末尾添加了这个,使它工作起来

public getRandomTrack():可观察{
这个.generateRandomNumbers();
console.log(this.drawing);
返回此文件。http
.get(API_端点)
.map(这个.data,这个);
}

关于这是好是坏的想法?

绘制的数组在您的服务中是全局的,因此您可以在需要内部服务时随时访问它,但您的问题在于地图调用,您应该按如下方式调用:

return this.http.get(API_ENDPOINT)
            .map(responseData => this.extractRandomData(responseData));

你可以使用上面的任何一个答案。两者都是正确的。 有关更多信息,请参阅此链接

示例代码

public getRandomTrack(){
  this.generateRandomNumbers();
  console.log(this.drawn);
  [1,2].map(this.extractData,this); //Pass this as argument
  [1,2].map(data => {               // Arrow function
  console.log(this.drawn);
}

 extractData(val : any){
  console.log(val);
  console.log(this.drawn);
 }

嗨,Maximus谢谢!请原谅我的无知,这里的v是什么?它只是一个变量,它将保存一个值
public getRandomTrack(){
  this.generateRandomNumbers();
  console.log(this.drawn);
  [1,2].map(this.extractData,this); //Pass this as argument
  [1,2].map(data => {               // Arrow function
  console.log(this.drawn);
}

 extractData(val : any){
  console.log(val);
  console.log(this.drawn);
 }