2014-02-23 9 views
13

ich diesen Breeze Fehler trafBreeze Fehler: Illegale Bau - Verwendung ‚oder‘ Überprüfungen kombinieren

[Illegal construction - use 'or' to combine checks]

auf Chrome, wenn die Bearbeitungsseite eines Unternehmens zu laden. Wenn ich die Seite aktualisiere, wird die Fehlermeldung nicht mehr angezeigt. Dieser Fehler tritt zufällig, unregelmäßig auf meiner Website auf. Ich konnte es nicht unter Verwendung eines bestimmten Szenarios reproduzieren, sondern habe es zufällig getroffen.

Ich sehe diese Fehlermeldung innerhalb Breeze Code

if (curContext.prevContext === null) { 
    curContext.prevContext = context; 
    // just update the prevContext but don't change the curContext. 
    return that; 
} else if (context.prevContext === null) { 
    context.prevContext = that._context; 
} else { 
    throw new Error("Illegal construction - use 'or' to combine checks"); 
} 

Könnten Sie mir bitte sagen: basierend auf über Code-Block, in welchen Fällen diese Fehler ausgelöst wird?

Vielen Dank.

+0

+1! Habe diesen Fehler auch bekommen – GETah

+2

Wir bekommen diesen Fehler auch. Bedenkt man, dass wir den Fehler in anderen Browsern (IE) nicht erhalten, dass wir die Version von breeze oder den Code, der darauf zugreift, nicht geändert haben und dass Google letzte Woche eine neue Version von Chrome veröffentlicht hat, denke ich das sehr gut könnte an der neuen Chrome-Version liegen. Vielleicht ein Bug in Chrome oder Brise oder etwas subtiler als eine Inkompatibilität oder die Verwendung von fragwürdigem/problematischem JavaScript-Code. – steve

+1

@steve Dies hängt definitiv mit dem neuesten Chrome-Update zusammen. In dem Moment, in dem ich von Version 32 auf 33 aktualisiert habe, habe ich angefangen, dieses Problem zu sehen. – larspars

Antwort

6

Wir sind ziemlich ratlos, weil niemand feststecken kann, wenn das passiert.

Würden Sie uns alle einen Gefallen tun und Ihre breeze.debug.js modifizieren, um mehr Informationen über den Stand der Dinge zu erhalten, wenn sie ausgelöst wird?

Vielleicht können Sie hinzufügen:

} else { 
    console.log("** Aaargh! 'curContext.prevContext': " + curContext.prevContext + 
       " 'context.prevContext': " + context.prevContext); 
    throw new Error("Illegal construction - use 'or' to combine checks"); 
} 

dem Strohhalm greifen. Alle Infos helfen.

Update 26 Feb 2014

AHA! Danke @steve, @matthias und anderen!

Wie ich privat vermutet habe, etwas, irgendwo, hat sich entschieden, prevContext zu undeclared statt null setzen. Ich würde empfehlen, dass wir sowieso zu "==" wechseln ... was für beide Fälle gilt. Falschheit ist gut genug, IMO. Wir melden uns bei Ihnen, wenn wir dies tun (vorausgesetzt, niemand im Breeze-Team wendet sich gegen die Anwendung eines Fixes, das wir nicht testen können).

-Update 27. Februar 2014

ich meine DocCode Tests mit breeze.min.js in Chrome v33 und sie alle Pass läuft.Frustrierend. Jay wird seine Tests mit breeze.min.js auch in Chrome v33 durchführen ... und wir werden sehen, ob einige von ihnen für ihn scheitern. Ich bin nicht hoffnungsvoll.

ich das erwartete Verhalten für sinnvoll (einschließlich der illegalen) Variationen von parm (undefined, null, true, false, ein string) auf der Linie von getEntityType die @Matthias

erwähnt
assertParam(parm, "okIfNotFound").isBoolean().isOptional().check(false); 

Meine statische Analyse der Code (wer vertraut dass?) sagt mir, dass der erste Vergleichsoperator === bleiben muss, während der Vergleichsoperator in der zweiten Klausel entweder == oder === sein kann. Der Autor des Codes arbeitete hart, um sicherzustellen, dass der linke Operand in der Praxis nie undefined war; meine statische Analyse zeigt, dass es könnteundefined werden ... obwohl ich nicht in der Lage bin, die Welt so zu arrangieren, dass es passiert. Vielleicht ein Versagen der Vorstellungskraft.

Meine statische Analyse des verkleinerten Code sagt, dass es richtig ist, obwohl meine minimierte Version von Ihnen anders, vielleicht weil mein gegen eine sich entwickelnde Kopie breeze.debug.js minimierte ist (irgendwo näher an, was v. 1.4.9 wird sein).

// Reformatted w/ spaces and new lines for readability. 
// Observe that the minifier reversed the direction of the second null test! 
// That is smart and does no harm 
// I can assure you the pre-minified code is the same as what you folks are reporting. 
function m(a,b) { 
    if(a._context){ 
      for(var c=a._context; null!=c.prevContext;) c=c.prevContext; 
      if(null === c.prevContext) return c.prevContext=b, a; 
      if(null !== b.prevContext) 
       throw new Error("Illegal construction - use 'or' to combine checks"); 
      b.prevContext=a._context 
    } 
    return n(a,b) 
} 

Unter diesen schwierigen Umständen, es sei denn wir eine versagende Test finden können, werden wir einen Sprung des Glaubens machen, ein Huhn schlachten, rattern einige Knochen und den Code dies ändern:

if (curContext.prevContext === null) { 
    curContext.prevContext = context; 
    // just update the prevContext but don't change the curContext. 
    return that; 
} else if (context.prevContext == null) { // CHANGED TO "if null or undefined" 
    context.prevContext = that._context; 
} else { 
    throw new Error("Illegal construction - use 'or' to combine checks"); 
} 

Wenn Sie die Zeit nutzen können, versuchen Sie dies bitte in Ihren Apps und bestätigen Sie, dass alles in Ordnung ist.

Wir versenden v.1.4.9 morgen (28 Feb) so Bitte versuchen Sie dies pronto!

+0

Bedenkt, dass mathias999us berichtet ** Aaargh! 'curContext.prevContext': undefiniert 'context.prevContext': null. Ist das Problem, einen oder beide Werte für Falsy anstelle von === null zu testen? Oder ist der undefinierte Wert ein Problem/unerwartet? – steve

+0

Haben Sie Glück bei Ihrer Untersuchung? Sieht so aus, als ob andere Leute die gleichen Probleme haben http://mosaicvivarium.blogspot.no/2014/02/known-issue-error-messages-especially.html – GETah

+0

Ich kann das nicht lokal reproduzieren, auch nicht mit der verkleinerten Version. Das Problem tritt jedoch auf, wenn es in der Produktion läuft. Ich denke, es gibt einen Timing-Faktor in der Gleichung ... – GETah

1

Mit Blick auf den Code erwartet Breeze entweder 'curContext.prevContext' oder 'context.prevContext' als 'null'. Einer von ihnen muss bei dieser Prüfung "null" sein. Der Fehler wird ausgelöst, wenn curContext.prevContext und context.prevContext bereits auf einen Wert festgelegt sind. Diese

+0

Obwohl Ihre Antwort richtig ist und die gestellte Frage beantwortet, möchte ich (und vielleicht die Person, die die Frage gestellt hat) wissen, welche Bedingungen zu dem Fehler führen. IOW, was ist die Ursache für diesen Fehler? – steve

3

gestartet auftritt, wenn Chrome auf Version 33 aktualisiert Es ist nicht in Chrome 32 geschah herabgestuft ich Breeze von Version 1.4.8 auf Version 1.4.7, und diese das Problem behoben das Problem passieren, die weniger oft .

(Die einzige in der changelog aufgeführten Bruch Änderung ist, dass contains Abfragen in Version 1.4.7 entwertet werden müssen, damit ein word = word.replace(/'/g, "''"); tun, bevor .where("yourColumn", "contains", word) tun.)

Edit:

Nö, Wechsel zu 1.4.7 hat das NICHT behoben, es hat das Problem nur viel seltener verursacht.

+0

Danke larspars. Ich benutze Breeze 1.4.1. Ich weiß nicht, ob das Ändern von Breeze von 1.4.1 auf 1.4.7 funktioniert. Lassen Sie mich einen Versuch machen – itjunkie

+0

erleben Sie diesen Fehler regelmäßig? Es ist so seltsam, dass dieser Fehler so zufällig, unregelmäßig auf meiner Website erscheint. Ich habe versucht, es mit einem bestimmten Szenario zu reproduzieren, konnte es aber nicht. Ich möchte es reproduzieren, bevor ich die Breeze-Versionsänderung anwende, um sicherzustellen, dass der Fehler nicht erneut auftritt. – itjunkie

+0

Danke für den Tipp, andere Versionen auszuprobieren. Bis jetzt haben wir _not_ nicht den Fehler für die debug/unminimized Version von 1.4.8 erhalten. Könnte es sein, dass der Fehler nicht auftritt, wenn er nicht minimiert wird? Oder ist das Verhalten einfach anders - schwieriger, den Fehler zu reproduzieren? – steve

7

Mein Team hatte dieses Problem auch. Es begann vor etwa einem Monat, hat aber in den letzten 1-2 Wochen wirklich zugenommen. Möglicherweise ist der kürzliche Chrome-Release schuld. Hier

ist, was ich weiß, alle Kommentare relativ 1.4.1 Brise:

-Das Verhalten intermittierend ist, und tritt scheinbar zufällig. Für mich deutet dies auf ein Timing-Problem hin.

-Der primäre Browser, der diesen Fehler erzeugt, ist chrome. Wir unterstützen auch Firefox und IE und haben keinen konkreten Beweis dafür, dass irgendein Browser außer Chrome diesen Fehler verursacht. Vielleicht hat die neue Version von Chrome ein anderes Leistungsprofil, das ein bereits bestehendes Problem noch einmal verschärft (erneutes Timing?)

-Für uns scheint die Beseitigung von Bündelung und Minification das Problem zu beseitigen. Ich glaube nicht, dass es ein Problem mit unserem minimierten Code (Microsoft Web Optimizations) gibt, da alles auf anderen Browsern funktioniert. Das deutet wieder auf ein Timing-Problem hin.

-Final, ich konnte es nur reproduzieren in meiner Entwicklungsumgebung mit den Chrome-Entwickler-Tools geöffnet. Mit einem q-Versprechungs-Stack und mühsamem Navigieren durch den verkleinerten Code konnte ich ihn auf Folgendes beschränken: Beim App-Start rufe ich fetchMetadata auf. Im fetchMetadata-Success-Handler rufe ich metadataStore.getEntityType ('some_entity') auf, und innerhalb dieser breeze-Methode wird der Fehler in meinem Szenario generiert.Etwas mit dem Metadatenspeicher wird zu diesem frühen Zeitpunkt im Seiten-App-Lebenszyklus nicht konsistent initialisiert oder eingerichtet.

BEARBEITEN: Aus den Kommentaren scheint dies ein Chrom 33 Fehler zu sein, wobei null! == null zu zufälligen Zeiten. Aus unbekannten Gründen scheint die Minimierung der breeze.debug.js-Datei verwandt zu sein (die meisten/alle Berichte des Problems werden in einer verkleinerten Version von breeze ausgeführt). Für mich Ändern Sie den folgenden Code in breeze.debug.js:

} else if (context.prevContext === null) { 
    context.prevContext = that._context; 
} else { 
    throw new Error("Illegal construction - use 'or' to combine checks"); 
} 

zu:

} else if (context.prevContext == null) { 
    context.prevContext = that._context; 
} else { 
    throw new Error("Illegal construction - use 'or' to combine checks"); 
} 

(Änderung === auf erste Zeile in ==) scheint das Problem als gelöst zu haben Problemumgehung. Alle anderen Aspekte der Brise funktionieren nach dieser Änderung gut für mich.

Eine andere Sache, die ich bemerkt habe, ist, dass die verkleinerte Version der Funktion ein Argument mit dem gleichen Namen der Funktion (t) hat. Dies erklärt immer noch nicht die Ergebnisse des "Aaarg" -Tests.

function t(n, t) { 
     if (n._context) { 
      for (var i = n._context; i.prevContext != null;) 
       i = i.prevContext; 
      if (i.prevContext === null) 
       return i.prevContext = t, n; 
      if (t.prevContext == null) 
       t.prevContext = n._context; 
      else 
       throw new Error("Illegal construction - use 'or' to combine checks"); 
     } 
     return b(n, t) 
    } 
+1

@Ward: Hier ist, was Sie bekommen: ** Aaargh! 'curContext.prevContext': undefined 'context.prevContext': null – mathias999us

+0

Hier ist ein weiterer kleiner Hinweis: Ich habe ein System eingerichtet, um den Metadatenspeicher im Client-Speicher für die Dauer einer Sitzung beizubehalten. Wenn die lokalen Metadaten auf dem App-Start der Seite gefunden werden, verwendet sie das und ruft entityManager.metadataStore.importMetadata() auf, anstatt entityManager.fetchMetadata aufzurufen. Nach dem Aufruf von importMetadata ruft es dann dieselbe Funktion auf wie der Erfolgshandler für den fetchMetadata-Aufruf, der wiederum metadataStore.getEntityType() aufruft, und ich habe gerade den illegalen Konstruktionsfehler auch in dieser Situation reproduziert. – mathias999us

+0

Anscheinend in Chrom 33, manchmal null! == null. Wenn Sie sich die Werte anschauen, die für "Aaargh!" test, es gibt keine Möglichkeit, dass die Ausführung in den Block eingetreten sein sollte, der den unzulässigen Konstruktionsfehler verursacht. Außerdem habe ich festgestellt, dass der Fehler in meinem Szenario in der zweiten Zeile von metadataStore.getEntityType auftritt: assertParam (okIfNotFound, "okIfNotFound"). IsBoolean(). IsOptional(). Check (false); Konkret geschieht dies beim Aufruf von isOptional. Es gibt keine Abhängigkeit, die ich von diesem Punkt an im asynchronen Code im Aufruf-Stack sehen kann, was ein Timing-Problem ausschließt. – mathias999us

1

Für unsere Anwendung Umschalten auf den nicht-minimierte (Debug) Version 1.4.8 Brise beseitigt den Fehler. Ich kann nicht mit Zuversicht sagen, dass dies das Problem für alle lösen wird, da ich die Ursache des Problems nicht kenne oder wie die Minimierung den Fehler verursacht. Vielleicht kann der Fehler immer noch mit der nicht-minitierten Version passieren, aber nicht in unserer Anwendung.

FWIW: Basierend auf unserer Erfahrung und was ich von anderen gelesen habe, wird der Fehler, dass sie dadurch in:

  • tritt nur in der neuesten Version von Chrome (33) - Windows und Mac!
  • passiert nicht immer.
  • scheint einen zeitlichen Aspekt zu haben. Bei uns passiert es nur in ersten Brise-Abfragen nach dem Start der Anwendung - obwohl nicht unbedingt die erste Abfrage.
  • tritt für jede Abfrage nach der ersten Abfrage, die fehlschlägt, auf.
2

Ok, wir haben gerade Breeze 1.4.9 mit Mathias999us's vorgeschlagenem Update veröffentlicht. Bitte lassen Sie uns wissen, ob dies das Problem behebt ... oder nicht. Danke Mathias;)

+0

Ich habe diesen Morgen aktualisiert, der Fehler ist nicht mehr da, soweit ich das beurteilen kann. – GETah

+1

@GETah, Ausgezeichnet !. Ich hoffe, andere haben die gleichen Ergebnisse :) –

Verwandte Themen