CaptainInler / findAtree

find:evergreen_tree:tree
https://captaininler.github.io/findAtree/
MIT License
0 stars 0 forks source link

`appState.userIsLoggedIn()` triggers an infinite loop #42

Open RalucaNicola opened 6 years ago

RalucaNicola commented 6 years ago

@beatfleischli kannst du dir das noch anschauen? Ich habe keine Ahnung was da los ist.

Repro:

ich will den Button zum Bäume hinzufügen auch für den Admin zeigen, nicht nur für user. Also wenn ich hier https://github.com/CaptainInler/findAtree/blob/master/src/app/map/map.component.html#L6 appState.userHasRole('user') mit appState.userIsLoggedIn() ändere, dann geht die App in einem endless loop. Ich habe nicht verstanden was da passiert.

beatfleischli commented 6 years ago

Also, ich habe es mir nochmals angeschaut. Ich glaube, das Problem ist nicht, dass das in einem endless Loop ausgeführt wird, sondern dass es dort ein console.log drin hat. Sonst würde man es nämlich gar nicht merken. Es werden alle diese #ngIfs in einem endless loop ausgeführt. Wahrscheinlich braucht es das um zu merken, ob sich was geändert hat. Auch das getMode ist ein eL, vergl. Screenshot. Und zwar wird getMode immer drei mal aufgerufen, dann wieder hasRole. Das kommt meiner Ansicht nach daher, dass getMode im Side-Panel noch zwei mal vorkommt. Nimm das console.log raus und mach die Änderung und alles ist paletti :). screen shot 2018-04-04 at 14 50 05

beatfleischli commented 6 years ago

Habe nochmals bei einem Kollegen nachgefragt, das sollte nicht sein. Ich bleibe dran.

beatfleischli commented 6 years ago

Meine Untersuchungen haben ergeben: in einer Beispiel App aus der Angular Vorlesung gibt es keinen Loop. Zwar auch mehrere Durchläufe, aber es stoppt. In unserer App habe ich alles rausgelöscht bis auf die eingebundenen Resources auf index.html. Alles, bis auf den einen Button mit einem *ngIf. Auch dann noch gibt es den Loop. Viel langsamer zwar, aber einen Loop. Das ist noch drin:

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <title>FindATree</title>
  <link rel="stylesheet" href="https://js.arcgis.com/4.7/esri/css/main.css">
  <script src="https://js.arcgis.com/4.7/"></script>
</head>

<body>
  <app-root></app-root>
  <script type="text/javascript">
    require([
      "dist/polyfills.bundle.js",
      "dist/vendor.bundle.js",
      "dist/main.bundle.js"],
      function (polyfills, vendor, main) { });
  </script>
</body>
</html>

Sorry, ich schaff's nicht, den Code als Code anzeigen zu lassen.... Entweder muss das so sein, wenn man esri benutzt, oder es ist ein Bug. Ich gebe es hier auf.

RalucaNicola commented 6 years ago

hey Beat, danke für die Bemühungen. Es ist am Ende kein Problem, wir können es mit appState.userHasRole('user') || appState.userHasRole('admin') ersetzen. Ich hab gedacht vielleicht ist es einfach für dich herauszufinden was da schief läuft.

p.s. für mehrere Lines code muss man ``` benutzen.

beatfleischli commented 6 years ago

Hallo Raluca

Anscheinend habe ich es unklar formuliert. Das Problem ist nicht appState.userHasRole oder app.State.userIsLoggedIn. Das Problem ist ngIf. Auch appState.getMode löst eine endless Loop aus, nur dass wir es nicht merken, weil es nirgends ein Console.log gibt. Jedes ngIf in unserer App löst eine endless Loop aus. Die laufen alle dauernd im Hintergrund parallel. Und das hat anscheinend mit der esri API zu tun. Weiter bin ich nicht gekommen.

Wenn ich die Karte rauslösche aus dem HTML Pfad, also die esri-map Component, dann wird der Loop viel langsamer. Aber erst wenn die Einbindung der API weg ist, verschwindet er ganz - was korrekt wäre.

Gruss Beat


ArchiMATIX Architekten ETH SIA Rudenzweg 54 - 8048 Zürich

b.fleischli@aui.ch mailto:b.fleischli@aui.ch 076 332 15 41

On 04 Apr 2018, at 19:21, Raluca Nicola notifications@github.com wrote:

hey Beat, danke für die Bemühungen. Es ist am Ende kein Problem, wir können es mit appState.userHasRole('user') || appState.userHasRole('admin') ersetzen. Ich hab gedacht vielleicht ist es einfach für dich herauszufinden was da schief läuft.

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/CaptainInler/findAtree/issues/42#issuecomment-378678615, or mute the thread https://github.com/notifications/unsubscribe-auth/AebDkZXH_ahJNobn1HMmnkO2GoBD7XqNks5tlQEngaJpZM4TEAy5.

RalucaNicola commented 6 years ago

oh...ok, jetzt verstehe ich. Ich habe gemeint appState.userHasRole('user') triggert keinen Loop, ich glaube ich habe es mit console.log ausprobiert. Aber jetzt weiss ich es nicht mehr. Ich schaue es noch auch an wenn ich dazu komme, wahrscheinlich erst am WE.

beatfleischli commented 6 years ago

Ich habe gemeint, ich habe es auch schon mal ausprobiert, da gab es nur 100 Aufrufe jedes mal und hat dann gestoppt. So hatte ich des Euch im Slack vor zwei Wochen geschrieben (Habe die Antwort inzwischen korrigiert...) Aber ev. war es damals noch so und hat erst jetzt mit der neuen API geändert....

On 05 Apr 2018, at 11:43, Raluca Nicola notifications@github.com wrote:

oh...ok, jetzt verstehe ich. Ich habe gemeint appState.userHasRole('user') triggert keinen Loop, ich glaube ich habe es mit console.log ausprobiert. Aber jetzt weiss ich es nicht mehr.

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/CaptainInler/findAtree/issues/42#issuecomment-378879618, or mute the thread https://github.com/notifications/unsubscribe-auth/AebDkc6Qb93MTCKO0BhYjqoJ58nmA4vGks5tledfgaJpZM4TEAy5.

RalucaNicola commented 6 years ago

oh man...das wird dann bestimmt auf unsere Challenges Folie enden...

CaptainInler commented 6 years ago

hmm dass müsste dann jemand von euch in die folien reinschreiben. ich verstehe nicht ganz um was es geht..🤦‍♂️

RalucaNicola commented 6 years ago

ja machen wir...sobald wir die Loesung haben hehe

RalucaNicola commented 6 years ago

ich glaube die Lösung ist nicht so einfach...ich habe es mit einem einfachen Projekt (der esri-loader benutzt) reproduzieren können: https://github.com/RalucaNicola/awesome-mapping-app Ich habe noch Tom und Rene bei mir bei der Arbeit gefragt, hoffentlich können sie uns weiter helfen.

beatfleischli commented 6 years ago

Raluca, bist Du hier schon weiter gekommen? Sonst könnten wir das Problem vielleicht auch mit einer 'manuellen' ChangeDetection lösen.... Hier zwei interessante Links zum Thema: https://blog.angularindepth.com/everything-you-need-to-know-about-change-detection-in-angular-8006c51d206f https://blog.angularindepth.com/these-5-articles-will-make-you-an-angular-change-detection-expert-ed530d28930

Wenn jemand noch Zeit findet....

RalucaNicola commented 6 years ago

Leider nicht, ich muss es mit dem neuesten build system von uns reproduzieren können und dann Ticket erstellen.

Danke für die Links, ich schaue es mir an...auf alle Fälle die Wahrscheinlichkeit ist gross dass ich es nicht bis zur Demo lösen kann...zum Glück läuft die App auch so...