2015-04-18 14 views
6

Tôi không hiểu hành vi này của mã dart2js.
Tôi chỉ có tính năng này trong chức năng async và chỉ sau khi biên dịch sang JS.So sánh không chính xác hai mã khóa trong chức năng async sau dart2js

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

nhưng

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

Đây là mã đơn giản để gỡ rối vấn đề của tôi.
Có gì không?

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'); 
    } 
} 

Output trên Chrome sau khi nhấn Enter (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 false
e.keyCode! = KeyCode.ENTER đúng
a = 13
b = 13
a.hashCode = 13
b.hashCode = 13
a == b đúng
a == 13 đúng
b == 13 đúng
DART: a = b

On DartVM (Dartium) tất cả mọi thứ là chính xác:

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 đúng
e.keyCode = KeyCode.ENTER sai
a = 13
b = 13
a.hashCode = 13
!b.hashCode = 13
a == b đúng
a == 13 đúng
b == 13 đúng
DART: a == b

// EDIT
tôi nhận thấy rằng nó không quan trọng mà tôi đang sử dụng keyCode.
Đây là vấn đề không đồng bộ.
Mã bên dưới trả về 'OK' trên Dartium và 'NOPE' trên Chrome sau khi biên dịch sang 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

Bạn nên gửi một lỗi tại www.dartbug.com. Bạn đang sử dụng phiên bản dart-sdk nào? – Robert

+0

mã .js cuối cùng thậm chí không chứa chuỗi "DART: a == b". – Robert

+0

Dart Editor phiên bản 1.9.3.release (STABLE) Phiên bản SDK phi tiêu 1.9.3 – 0pako0

Trả lời

3

Điều này thực sự giống như this bug.

Loại sai được suy ra cho biến lặp của async cho vòng lặp.

Nó được sửa trong 1,10.

+1

Điều này không cung cấp câu trả lời cho câu hỏi. Để phê bình hoặc yêu cầu làm rõ từ tác giả, để lại nhận xét bên dưới bài đăng của họ - bạn luôn có thể nhận xét về bài đăng của riêng bạn và sau khi bạn có đủ [danh tiếng] (http://stackoverflow.com/help/whats-reputation), bạn sẽ có thể [nhận xét về bài đăng bất kỳ] (http://stackoverflow.com/help/privileges/comment). –

+0

@ Gabriel.Massana Tôi nghĩ rằng câu trả lời này là câu hỏi, vì không có giải pháp thực sự nhưng để cập nhật. Tôi đã chỉnh sửa câu trả lời để thêm liên kết vào trình gỡ lỗi để tham khảo độc giả trong tương lai. – Tensibai

+0

Tôi cũng không thấy bất kỳ thông tin bổ sung nào cho câu trả lời của @ 0pako0. –

1

Lỗi này phải là 1.9.3 dart2js.

Tôi hiện sử dụng phiên bản SDK Dart 1.10.0-dev.1.5 và mọi thứ hoạt động tốt. Đây chỉ là giải pháp những gì tôi tìm thấy, nếu tôi muốn sử dụng 'đang chờ đợi'.

Các vấn đề liên quan