dart2js 后异步函数中两个 keyCode 的比较不正确

Posted

技术标签:

【中文标题】dart2js 后异步函数中两个 keyCode 的比较不正确【英文标题】:Incorrect comparison of two keyCodes in async function after dart2js 【发布时间】:2015-06-25 00:50:30 【问题描述】:

我不理解 dart2js 代码的这种行为。 我只有在异步函数中才有这个,并且只有在编译为 JS 之后。

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

但是

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

这是调试我的问题的简单代码。 怎么回事?

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

按 Enter 后在 Chrome 上的输出(dart2js - 缩小):

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 true a = 13 b = 13 a.hashCode = 13 b.hashCode = 13 a == b 真 a == 13 对 b == 13 真 飞镖:a != b

在 DartVM (Dartium) 上一切正常:

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 true e.keyCode != KeyCode.ENTER false a = 13 b = 13 a.hashCode = 13 b.hashCode = 13 a == b 真 a == 13 对 b == 13 真 飞镖:a == b

// 编辑 我注意到我使用 keyCode 并不重要。 这是异步问题。 以下代码在编译为 JS 后在 Dartium 上返回“OK”,在 Chrome 上返回“NOPE”。

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

【问题讨论】:

您应该在 www.dartbug.com 提交错误。你使用的是哪个版本的 dart-sdk? 最终的 .js 代码甚至不包含字符串“DART: a == b”。 Dart Editor 版本 1.9.3.release (STABLE) Dart SDK 版本 1.9.3 【参考方案1】:

这确实和this bug一样。

为 async for 循环的迭代变量推断了错误的类型。

在 1.10 中已修复。

【讨论】:

这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时评论自己的帖子,一旦您有足够的reputation,您就可以comment on any post。 @Gabriel.Massana 我确实认为这回答了这个问题,因为除了更新之外没有真正的解决方案。我编辑了答案以将链接添加到 bugtracker 以供将来的读者参考。 我也没有看到@0pako0 回答的任何其他信息。 @GünterZöchbauer 嗯,确认这是一个已知的错误,给出它的链接,做一个简短的,以防链接中断,并确保它修复的版本。恕我直言,这是一个更好的答案,因为有事实,而不仅仅是观察。 我更愿意评论 @0pako0 的回答 - 但没有足够的分数。【参考方案2】:

这一定是 1.9.3 的 dart2js 错误。

我现在使用 Dart SDK 版本 1.10.0-dev.1.5,一切正常。如果我想使用“等待”,这只是我找到的解决方案。

【讨论】:

以上是关于dart2js 后异步函数中两个 keyCode 的比较不正确的主要内容,如果未能解决你的问题,请参考以下文章

两个异步请求成功后执行第三个异步函数

dart2js 代码如何比 javascript 更快?

从 dart2js 或 dart-analyzer 获取类型化语法树

如何获取自己键盘上按键的键值(KeyCode)

Javascript - 异步调用后同步

如何处理来自异步函数python的数据