angular - ERROR TypeError: Cannot set property 'property' of undefined -


my problem created when execute method subscribe, , don't understand why. code , error generates in console:

getinfo(idgestore:number){     let zonaobs=this._zonaservice.getinfoparks(idgestore);     zonaobs.subscribe(data=>{       this.zones=data;       var citta:string;       for(var i=0;i<this.zones.length;i++){         // this.zones[i].citta=null;         this.location.lat=this.zones[i].latitudine;         this.location.lng=this.zones[i].longitudine;         this._zonaservice.getcity(this.location)         .subscribe((data)=>{           citta=data;           })         console.log(this.zones[i].id);         var id_zona=this.zones[i].id;         console.log(id_zona)         this._tipologiazonaservice.getnumbertotal(id_zona)         .subscribe((data)=>{           this.zones[i].numero=data         })         console.log(this.zones)       }     });    } 

error:

error typeerror: cannot set property 'numero' of undefined     @ safesubscriber._next (allinfopark.component.ts:44)     @ safesubscriber.webpackjsonp.../../../../rxjs/subscriber.js.safesubscriber.__tryorunsub (subscriber.js:238)     @ safesubscriber.webpackjsonp.../../../../rxjs/subscriber.js.safesubscriber.next (subscriber.js:185)     @ subscriber.webpackjsonp.../../../../rxjs/subscriber.js.subscriber._next (subscriber.js:125)     @ subscriber.webpackjsonp.../../../../rxjs/subscriber.js.subscriber.next (subscriber.js:89)     @ catchsubscriber.webpackjsonp.../../../../rxjs/subscriber.js.subscriber._next (subscriber.js:125)     @ catchsubscriber.webpackjsonp.../../../../rxjs/subscriber.js.subscriber.next (subscriber.js:89)     @ mapsubscriber.webpackjsonp.../../../../rxjs/operator/map.js.mapsubscriber._next (map.js:83)     @ mapsubscriber.webpackjsonp.../../../../rxjs/subscriber.js.subscriber.next (subscriber.js:89)     @ xmlhttprequest.onload (http.es5.js:1226) 

your problem here. using same i variable closure

.subscribe((data)=>{     this.zones[i].numero=data }) 

means captures i variable.

this code works asynchronously. means subscribe work, after getnumbertotal ready.

when code runs first time, i 0. reaches line , pass function thread (not javascript thread) run , continues. when finishes call, waits until javascript thread finishes it's code , after i value this.zones.length. event loop gets out callbacks subscribes , see there variable i value this.zones[this.zones.length] , when tries call this.zones[this.zones[this.zones.length]], undefined. why error.

replace var i definition let i. forces for loop each iteration create it's own i variable, each subscribe has captures it's own i.


Comments