【发布时间】:2015-02-23 15:52:53
【问题描述】:
我的函数必须创建一个目录,并将整个文件夹层次结构从另一个目录复制到这个新目录。所有的操作都是异步完成的,但是我希望这个函数返回一个 Future,当我在它上面调用 .then(result) 时,它将完成所有的异步工作。
但我不知道我应该把我的completer.complete() 放在哪里来实现这一点。
Future<Directory> createCopyDirectory(Directory directoryToCreate){
Completer<Directory> completer = new Completer<Directory>();
completer.complete(
directoryToCreate.create().then((directory){
Directory contentToCopy = new Directory(globalPathOfDirectoryToCopy);
List<Future> creatingContent = new List<Future>();
contentToCopy.list(recursive:true, followLinks:false).forEach((f){
if (f is File){
File fileToCreate = new File(f.path.replaceFirst('pages', userID));
creatingContent.add(fileToCreate.create(recursive:true).then((_){
f.readAsString().then((fileContent){
fileToCreate.writeAsString(fileContent);
});
}));
}
});
return Future.wait(creatingContent).then((_){ return directoryToCreate;});
})
);
return completer.future;
}
我确切地说我的函数按预期工作,但是如果我尝试直接访问我应该在这个函数中创建的内容,就像在then() 调用中一样,Dart 给我带来了一个期望,就像我没有创建内容一样。所以completer.complete() 肯定是错误的,在内容创建之前调用then()。
我尝试在结尾处使用completer.complete() Future.wait(creatingContent) 或将return directoryToCreate 替换为completer.complete(directoryToCreate),但结果是一样的。
我对在这种情况下构建适当的基于 Future 的函数的方式有点困惑。
【问题讨论】:
标签: dart future dart-async