在Dart中将范围对象保存在范围之外

时间:2014-05-14 17:16:49

标签: dart dart-async

在文件读取退出后,以下内容为空:

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。如果可以的话,我会把我的思绪包裹在飞镖之路上。

1 个答案:

答案 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的
  file2

     

file1的
  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
}

另见:

也许