2015-04-18 7 views
6

Non capisco questo comportamento del codice dart2js.
Ho questo solo in funzione asincrona e solo dopo la compilazione a JS.Confronto errato di due codici chiave in funzione asincrona dopo dart2js

e.keyCode is equal 13 
KeyCode.ENTER is equal 13 

ma

(e.keyCode == KeyCode.ENTER) is false 

Questo è semplice codice per il debug il mio problema.
Cosa sta succedendo?

import 'dart:html'; 

main() async 
{ 
    await for(KeyboardEvent e in window.onKeyDown) 
    { 
    print('e.keyCode : ${e.keyCode}'); 
    print('e.keyCode.hashCode : ${e.keyCode.hashCode}'); 
    print('KeyCode.ENTER : ${KeyCode.ENTER}'); 
    print('KeyCode.ENTER.hashCode : ${KeyCode.ENTER.hashCode}'); 
    print('e.keyCode.runtimeType : ${e.keyCode.runtimeType}'); 
    print('KeyCode.ENTER.runtimeType : ${KeyCode.ENTER.runtimeType}'); 
    print('e.keyCode == KeyCode.ENTER ${e.keyCode == KeyCode.ENTER}'); 
    print('e.keyCode != KeyCode.ENTER ${e.keyCode != KeyCode.ENTER}'); 
    int a = e.keyCode; 
    int b = KeyCode.ENTER; 
    print('a = $a'); 
    print('b = $b'); 
    print('a.hashCode = ${a.hashCode}'); 
    print('b.hashCode = ${b.hashCode}'); 
    print('a == b ${(a == b).toString()}'); 
    print('a == 13 ${(a == 13).toString()}'); 
    print('b == 13 ${(b == 13).toString()}'); 
    if(a == b) 
     print('DART: a == b'); 
    else 
     print('DART: a != b'); 
    } 
} 

uscita su Chrome dopo aver premuto Invio (dart2js - minified):

e.keyCode: 13
e.keyCode.hashCode: 13
KeyCode.ENTER: 13
KeyCode. ENTER.hashCode: 13
e.keyCode.runtimeType: int
KeyCode.ENTER.runtimeType: int
e.keyCode == KeyCode.ENTER falsa 0.123. e.keyCode! = KeyCode.ENTER vero
a = 13
b = 13
a.hashCode = 13
b.hashCode = 13
a == b vera
a == 13 vero
b == 13 vero
DART: a = b

On DartVM (Dartium) tutto sia corretto:

01.235.164,106 mila

e.keyCode: 13
e.keyCode.hashCode: 13
KeyCode.ENTER: 13
KeyCode.ENTER.hashCode: 13
e.keyCode.runtimeType: int
KeyCode.ENTER.runtimeType : int
e.keyCode == KeyCode.ENTER vero
e.keyCode = KeyCode.ENTER falso
a = 13
b = 13
a.hashCode = 13
!b.hashCode = 13
a == b vera
a == 13 vero
b == 13 vero
DART: a == b

// EDIT
I ho notato che non importa che sto usando keyCode.
Questo è un problema asincrono.
Il codice sottostante restituisce 'OK' su Dartium e 'NOPE' su Chrome dopo la compilazione su JS.

import 'dart:async'; 

main() async 
{ 
    var ctrl = new StreamController(); 
    ctrl.add(true); 

    await for(var e in ctrl.stream) 
    { 
    if(e == e) 
     print('OK'); 
    else 
     print('NOPE'); 
    } 
} 
+2

È necessario presentare un errore su www.dartbug.com. Quale versione di dart-sdk stai usando? – Robert

+0

il codice .js finale non contiene nemmeno la stringa "DART: a == b". – Robert

+0

Dart Editor versione 1.9.3.release (STABILE) Dart SDK versione 1.9.3 – 0pako0

risposta

3

È lo stesso di this bug.

Il tipo errato è stato dedotto per la variabile di iterazione asincrona per i loop.

È fissato in 1.10.

+1

Ciò non fornisce una risposta alla domanda. Per criticare o richiedere chiarimenti da un autore, lascia un commento sotto il loro post - puoi sempre commentare i tuoi post, e una volta che hai [reputazione] sufficiente (http://stackoverflow.com/help/whats-reputation) essere in grado di [commentare qualsiasi post] (http://stackoverflow.com/help/privileges/comment). –

+0

@ Gabriel.Massana Penso che questo risponda alla domanda, in quanto non esiste una soluzione reale ma da aggiornare. Ho modificato la risposta per aggiungere il link al bugtracker per i futuri lettori di riferimento. – Tensibai

+0

Inoltre non vedo alcuna informazione aggiuntiva alla risposta di @ 0pako0 s. –

1

Questo deve essere il bug di 1.9.3 dart2js.

Io uso ora Dart SDK versione 1.10.0-dev.1.5 e tutto funziona correttamente. Questa è solo una soluzione che ho trovato, se voglio usare "attendere".