2017-06-10 3 views
0

Ich benutze Angular2 und Meteor. Ich habe eine Ausnahme (Maximum Call-Stack-Größe überschritt) in meiner Chrome-Konsole, da ich diesen Code in meiner Client-Seite hinzugefügt:Maximale Call-Stack-Größe überschritten mit 2 Collection.find

var userChannelsId = UserChannels.find({idUser: Meteor.userId()}); 
this.channels = Channels.find({_id: {$in: userChannelsId}}); 

Von dem, was ich gefunden, diese Ausnahme tritt auf, wenn eine Endlosschleife ist. Ich bin sicher, dass der Fehler von diesen Zeilen kommt (ich habe meinen Code debuggt, bis ich sicher war). Kommt das Problem von der Tatsache, dass die erste Suche nicht beendet ist, wenn die zweite beginnt?

Alle Funktion:

getChannelList(): void { 
    console.log('ok'); 
    var userChannelsId = UserChannels.find({idUser: Meteor.userId()}); 
    this.channels = Channels.find({_id: {$in: userChannelsId}}); 
    console.log('ko'); 

    this.channels.subscribe(channel => { 
     this.selectChannel(channel[0]); 
    }); 
} 

EDIT:

Als @MichaelSolati habe ich versucht, nur die IdChannel des userChannel zu bekommen, aber ich habe immer noch die gleichen Fehler ... Es gibt einen beobachtbaren und nicht eine Anordnung. Vielleicht ist es das Problem? Dies ist, was ich getan habe:

getChannelList(): void { 
    console.log('ok'); 
    let userId = Meteor.userId(); 
    var userChannelsId = UserChannels.find({idUser: userId}); 
    var values = userChannelsId.map((userChannels:Array<UserChannel>) => { 
     let result:Array<String> = []; 
     if (userChannels) { 
      userChannels.forEach((userChan) => { 
       result.push(userChan.idChannel); 
      }); 
     } 
     return result; 
    }); 
    this.channels = Channels.find({_id: {$in: values}}); 
    console.log('ko'); 
    this.channels.subscribe(channel => { this.selectChannel(channel[0]); }); 
} 
+0

Verwenden Sie 'setTimeout (function() {// Ihr Code hier}, 0})' zu vermeiden Call Stack Größe überschritten Problem –

+0

Was muss ich in die Funktion einfügen? All mein getChannelList-Code oder nur meine Collection.find? –

+0

Sie müssen Ihren unendlichen Code in die Callback-Funktion 'setTimeout' setzen –

Antwort

1

Okay Jungs,

fand ich eine Lösung, die funktioniert ziemlich gut! Wenn Sie Vorschläge haben meinen Vorschlag zu verbessern, füllen frei zu äußern, würde ich es zu schätzen wissen :)

getChannelList(): void { 
    let userId = Meteor.userId(); 
    UserChannels.find({idUser:userId}).subscribe((userChannel:UserChannel[]) =>{ 
     var channelsId:Array<String> = []; 
     userChannel.forEach((userChan)=>{ 
      channelsId.push(userChan.idChannel); 
     }); 
     this.channels = Channels.find({_id: {$in: channelsId}}); 
    }); 
    if(this.channels !== undefined) { 
     this.channels.subscribe(channel => { 
      this.selectChannel(channel[0]); 
     }); 
    } 
} 

Danke allen für Ihre Antworten.

1

Aktualisiert wegen der Verwendung von MeteorRxJS für die Abfragen. Obwohl es wahrscheinlich nicht perfekt ist, sollte es Sie wahrscheinlich auf den richtigen Weg bringen.

private userChannelsSub: Subscription; 

getChannelList(): void { 
    console.log('ok'); 
    let userId = Meteor.userId(): 
    let this.userChannelsSub = UserChannels.find({idUser: userId}).subscribe((userChannels: any[]) => { 
     if (Array.isArray(userChannels)) { 
      let userChannelsId = userChannels.map((channel: any) => { return channel._id; }); 
      if (this.channels) { this.channels.unsubscribe(); } 
      this.channels = Channels.find({_id: {$in: userChannelsId}}).subscribe((channels: any[]) => { 
       this.selectChannel(channels[0]); 
      }); 
     } 
    }); 
    console.log('ko'); 
} 
+0

Ich habe getan, was Sie vorgeschlagen, aber leider ist die Ausnahme immer noch hier :( –

+0

Warten Sie ... Sie versuchen, eine Liste der Kanäle, die ein Benutzer gehört und suchen alle Kanäle für sie, nicht wahr? Aber du gehst in dich hinein. 'Channels' finden ein Array der vollständigen Objekte deiner 'UserChannels'-Abfrage, kein Array von IDs. Versuchen Sie dies, nachdem Sie die 'UserChannels' Abfrage machen ... ' userChannelsId = userChannelsId.map ((Kanal) => {return channel._id;}); ' – MichaelSolati

+0

ich meinen Beitrag editiert Ihnen zu zeigen, wie ich versuchte. Ich musste etwas ändern, da die Abfrage ein Array von UserChannel zurückgibt. Sag mir, wenn ich etwas falsch gemacht habe. (Es funktioniert immer noch nicht :() –

Verwandte Themen