上面的問題在Dart Google+社區提出,並沒有給出明確的答案,所以我想我會在這裏重複這個問題,因爲我真的很想知道。下面是來自飛鏢界的帖子:如何在Dart中異步讀取文件?
https://plus.google.com/u/0/103493864228790779294/posts/U7VTyX5h7HR
那麼,什麼是正確的方法來做到這一點,有和沒有錯誤處理?
上面的問題在Dart Google+社區提出,並沒有給出明確的答案,所以我想我會在這裏重複這個問題,因爲我真的很想知道。下面是來自飛鏢界的帖子:如何在Dart中異步讀取文件?
https://plus.google.com/u/0/103493864228790779294/posts/U7VTyX5h7HR
那麼,什麼是正確的方法來做到這一點,有和沒有錯誤處理?
你鏈接到的問題是關於異步閱讀多個文件的內容,這是一個更難的問題。我認爲弗洛裏安的解決方案沒有問題。簡化IT,這似乎已成功異步讀文件:
import 'dart:async';
import 'dart:io';
void main() {
new File('/home/darshan/so/asyncRead.dart')
.readAsString()
..catchError((e) => print(e))
.then(print);
print("Reading asynchronously...");
}
此輸出:
Reading asynchronously... import 'dart:async'; import 'dart:io'; void main() { new File('/home/darshan/so/asyncRead.dart') .readAsString() ..catchError((e) => print(e)) .then(print); print("Reading asynchronously..."); }
爲了記錄在案,這裏是弗洛裏安Loitsch的(略有修改)解決方案最初的問題:
import 'dart:async';
import 'dart:io';
void main() {
new Directory('/home/darshan/so/j')
.list()
.map((f) => f.readAsString()..catchError((e) => print(e)))
.toList()
.then(Future.wait)
.then(print);
print("Reading asynchronously...");
}
Florian的解決方案的一個缺點是它並行讀取所有文件,並且只有在讀取所有內容後才處理內容。在某些情況下,您可能需要逐個讀取文件,並在讀取下一個文件之前處理一個文件的內容。
爲此,您必須將期貨鏈接在一起,以便下一個readAsString僅在前一個readAsString完成後才運行。
Future readFilesSequentially(Stream<File> files, doWork(String)) {
return files.fold(
new Future.immediate(null),
(chain, file) =>
chain.then((_) => file.readAsString())
.then((text) => doWork(text)));
}
在文本上完成的工作甚至可以是異步的,並返回Future。
如果流回報文件A,B和C,然後完成後,程序將:
run readAsString on A
run doWork on the result
when doWork finishes (or the future it returns completes) run readAsString on B
run doWork on the result
when doWork finishes (or the future it returns completes) run readAsString on C
run doWork on the result
when doWork finishes, complete the future returned by processFilesSequentially.
我們需要使用倍,而不是聽,讓我們得到了完成的Future當流完成時,而不是運行onDone處理程序。
你應該在這裏粘貼問題。 –
完整的問題是在主題:如何在Dart中異步讀取文件 - 或者我錯過了什麼?畢竟,這是我的第一個SO問題。 :) –