Сохранение объекта за пределами области видимости в Dart

Следующее оставляет s null после завершения чтения файла:

String s;
new File('etc.stk').readAsString().then((String contents) {
    s = contents;
});
// s is null here.

Есть ли способ сохранить (или клонировать) s, или я вынужден использовать его только в области .then?

У меня есть несколько тысяч строк кода компилятора/интерпретатора, который анализирует и запускает содержимое файла, и я бы предпочел, чтобы они не находились внутри новой области файлов.

ИЗМЕНИТЬ

Чтобы предоставить больше контекста, я пытаюсь сделать что-то вроде

new File('etc1.stk').readAsString()
    .then((String script) {     
      syntaxTree1 = buildTree(script);
    });
new File('etc2.stk').readAsString()
    .then((String script) {
      syntaxTree2 = buildTree(script);
    }); 

и иметь доступ как к синтаксисуTree1, так и к синтаксисуTree2 в последующем коде. Если смогу, я обдумаю Путь дротика.


person Andrew Duncan    schedule 14.05.2014    source источник


Ответы (1)


ИЗМЕНИТЬ
(этот код проверен)

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()
  ]);
}

выход:

файл1
файл2

файл1
файл2

ИЗМЕНИТЬ КОНЕЦ

подсказка: код не проверен

// s is null here

потому что эта строка выполняется до

s = contents

Этот код

new File('etc.stk').readAsString()

возвращает будущее, которое зачисляется в очередь событий и выполняется, когда фактический «поток» выполнения завершен.

Если бы вы предоставили больше кода, у меня был бы лучший контекст для предлагаемого решения.
Что вы могли бы сделать, так это

String s;
new File('etc.stk').readAsString().then((String contents) {
    s = contents;
}).then((_) {
// s is **NOT** null here.
});

or

//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
}

or

Future<String> myReadAsString() {
  return new File('etc.stk').readAsString();
}

myReadAsString().then((s) {
  // s is **NOT** null here
}

смотрите также:

и возможно

person Günter Zöchbauer    schedule 14.05.2014
comment
Спасибо @Günter, я думаю, что предложения 1 или 3 могут быть тем, что я ищу. Чтобы предоставить больше контекста, я пытаюсь прочитать несколько файлов, обработать их в отдельные синтаксические деревья и по-прежнему иметь доступ к деревьям после завершения блока чтения. Кажется, я не совсем понял, что имелось в виду. Я постараюсь следовать пути дротика. - person Andrew Duncan; 15.05.2014
comment
Я добавил ваш комментарий к вашему вопросу и обновил свой ответ примером, который я действительно протестировал. - person Günter Zöchbauer; 15.05.2014