runZoned提供的特殊功能dart:async.该文件在此处:https://api.dartlang.org/docs/channels/stable/latest/dart_async.html#runZoned
我不确定这个功能的目的是什么,我们什么时候需要它,以及如何正确使用它?
我想了解,飞镖事件循环如何工作.我从网站The Event Loop和Dart中读到了事件循环文章,作者解释了dart中的事件循环是如何工作的.
但我不明白的是,事件是如何排队的.例如
new Future(() => 21)
.then((v) => v*2)
.then((v) => print(v));
Run Code Online (Sandbox Code Playgroud)
这里会不会在事件队列中创建三个条目或只创建一个条目?我知道,类Future负责延迟执行,当我从中创建一个对象时
new Future(() => 21)
Run Code Online (Sandbox Code Playgroud)
它只是事件循环中的一个条目.
在我上面提到的这篇文章中,我读到了微任务.这个微任务将在事件队列之前执行,但我没有看到任何意义,为什么dart团队实现这个微任务呢?也许我需要一些例子!
我不明白dart2js代码的这种行为.
我只在async函数中使用它,并且只在编译成JS之后.
e.keyCode is equal 13
KeyCode.ENTER is equal 13
Run Code Online (Sandbox Code Playgroud)
但
(e.keyCode == KeyCode.ENTER) is false
Run Code Online (Sandbox Code Playgroud)
这是调试我的问题的简单代码.
这是怎么回事?
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 …Run Code Online (Sandbox Code Playgroud) 我最近看到了一些像下面这样的代码示例
Future<Null> ensureLogin() {...}
var login = ensureLogin();
Future functionA() async {
await login;
print("FunctionA finished");
}
Future functionB() async {
await login;
print("FunctionB finished");
}
void main() {
functionA();
functionB()
}
Run Code Online (Sandbox Code Playgroud)
当 future 完成时,它会打印如下:
FunctionA finished
FunctionB finished
Run Code Online (Sandbox Code Playgroud)
看起来我们可以对同一个未来对象有多个等待?但这到底是如何运作的呢?它相当于 Future 是什么?也许像下面这样?
login.then(functionA).then(fucntionB)
Run Code Online (Sandbox Code Playgroud) 有没有之间的差异async方法,返回void,和一个回报Future<void>?似乎两者在 Dart 中都有效:
void main() async {
await myVoid();
await myFutureVoid();
}
void myVoid() async {
// Do something
}
Future<void> myFutureVoid() async {
// Do something
}
Run Code Online (Sandbox Code Playgroud)
它们相同吗?
如果是这样,为什么void在例如不允许时允许int?编译器说“标记为 'async' 的函数必须具有可分配给 'Future' 的返回类型”。
在以某种方式阅读了Dart 单元测试后,我仍然无法理解如何将它与Futures一起使用。
例如:
void main()
{
group('database group',(){
setUp( () {
// Setup
});
tearDown((){
// TearDown
});
test('open connection to local database', (){
DatabaseBase database = null;
expect(database = new MongoDatabase("127.0.0.8", "simplechat-db"), isNotNull);
database.AddMessage(null).then(
(e) {
expectAsync1(e)
{
// All ok
}
},
onError: (err)
{
expectAsync1(bb)
{
fail('error !');
}
}
);
});
// Add more tests here
Run Code Online (Sandbox Code Playgroud)
}); }
因此,在测试中,我创建了一个基本抽象类的实例,DatabaseBase并为实际的MongoDb类创建了一些参数,并立即检查它是否已创建。然后,我只是运行一些很简单的功能:AddMessage。该函数定义为:
Future AddMessage(String message);
Run Code Online (Sandbox Code Playgroud)
并返回completer.future …
给出以下 Dart 代码片段:
Stream stream1 = new Stream.periodic(new Duration(seconds: 1), (n) => n)
.take(10)
.asBroadcastStream();
stream1.listen((n) => print("stream1 : $n"),
onError : (err) => print("stream1 : $err"),
onDone : () => print("stream1 : done"),
cancelOnError : false);
Stream stream2 = stream1.where((n) => n % 2 == 0).take(2);
stream2.listen((n) => print("stream2 : $n"),
onError : (err) => print("stream2 : $err"),
onDone : () => print("stream2 : done"),
cancelOnError : false);
Stream stream3 = stream1.where((n) => n % 2 != 0).take(2);
stream3.listen((n) …Run Code Online (Sandbox Code Playgroud) 我正在使用此代码片段在单元测试中读取数据文件:
var file = new File('/Users/chambery/projects/Foo/src/resources/skills.yaml');
Future<String> finishedReading = file.readAsString();
finishedReading.then((text) {
print(text);
print(loadYaml(text));
});
Run Code Online (Sandbox Code Playgroud)
在 Dart 编辑器中运行我没有收到错误(但没有打印输出),
...
PASS: calc_ranks
PASS: load_skills
All 7 tests passed.
unittest-suite-success
Run Code Online (Sandbox Code Playgroud)
(编辑:删除了命令行错误;dart vm 已过时)
我不需要异步文件读取。
我有一个类定义了一个返回 Future 的方法。Future 包含一个类列表,这些类也返回一个未来。
class User{
Future<List<Album>> albums(){
};
}
class Album{
Future<List<Photos>> photos(){
}
};
Run Code Online (Sandbox Code Playgroud)
在测试另一个类时模拟这些类中方法的最佳方法是什么?
我试图测试的课程看起来有点像
class Presenter {
Presenter( User user){
user.albums().then( _processAlbums);
}
_processAlbums(List<Album> albums) {
albums.forEach( (album)=>album.photos.then( _processPhotos));
}
_processPhotos(List<Photo> photos) {
....stuff
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试编写这样的单元测试
class MockUser extends Mock implements User{}
class MockAlbum extends Mock implements Album{}
class MockPhoto extends Mock implements Photo{}
class MockFutureList<T> extends Mock implements Future<T>{
MockFutureList( List<T> items){
when( callsTo( "then")).thenReturn( items);
}
}
void main(){
test("constuctor should request the …Run Code Online (Sandbox Code Playgroud) 各位 Dart 程序员。
我正在使用 Stream 读取文件,如下所示。
Stream<List<int>> stream = new File(filepath).openRead();
stream
.transform(UTF8.decoder)
.transform(const LineSpilitter())
.listen((line){
// TODO: check if this is the last line of the file
var isLastLine;
});
Run Code Online (Sandbox Code Playgroud)
我想检查listen()中的行是否是文件的最后一行。
dart ×10
dart-async ×10
future ×2
async-await ×1
asynchronous ×1
dart-io ×1
dart2js ×1
event-loop ×1