在文件读取退出后,以下内容为空:
String s;
new File('etc.stk').readAsString().then((String contents) {
s = contents;
});
// s is null here.
有没有办法保存(或克隆),或者我是否被迫只在.then范围内使用它?
我有几千行编译器/解释器代码来解析和运行文件内容,并且不希望将它们都放在新的File范围内。
编辑
为了提供更多上下文,我想要做的就是
new File('etc1.stk').readAsString()
.then((String script) {
syntaxTree1 = buildTree(script);
});
new File('etc2.stk').readAsString()
.then((String script) {
syntaxTree2 = buildTree(script);
});
并且可以在后续代码中访问syntaxTree1和syntaxTree2。如果可以的话,我会把我的思绪包裹在飞镖之路上。
答案 0 :(得分:3)
修改强>
(此代码已经过测试)
import 'dart:async' as async;
import 'dart:io' as io;
void main(args) {
// approach1: inline
async.Future.wait([
new io.File('file1.txt').readAsString(),
new io.File('file2.txt').readAsString()
]).then((values) {
values.forEach(print);
});
// approach2: load files in another function
getFiles().then((values) {
values.forEach(print);
});
}
async.Future<List> getFiles() {
return async.Future.wait([
new io.File('file1.txt').readAsString(),
new io.File('file2.txt').readAsString()
]);
}
输出:
file1的
file2file1的
file2
编辑结束
提示:代码未经过测试
// s is null here
是因为此行在
之前执行s = contents
此代码
new File('etc.stk').readAsString()
返回在事件队列中登记的未来,并在实际的&#39;线程中执行。执行完毕。
如果您提供了更多代码,我会为拟议的解决方案提供更好的背景信息 你能做的是
String s;
new File('etc.stk').readAsString().then((String contents) {
s = contents;
}).then((_) {
// s is **NOT** null here.
});
或
//String s;
new File('etc.stk').readAsString().then((String contents) {
//s = contents;
someCallback(s)
});
// s is null here.
void someCallback(String s) {
// s is **NOT** null here
}
或
Future<String> myReadAsString() {
return new File('etc.stk').readAsString();
}
myReadAsString().then((s) {
// s is **NOT** null here
}
另见:
也许