2013-04-16 63 views
1

上面的問題在Dart Google+社區提出,並沒有給出明確的答案,所以我想我會在這裏重複這個問題,因爲我真的很想知道。下面是來自飛鏢界的帖子:如何在Dart中異步讀取文件?

https://plus.google.com/u/0/103493864228790779294/posts/U7VTyX5h7HR

那麼,什麼是正確的方法來做到這一點,有和沒有錯誤處理?

+0

你應該在這裏粘貼問題。 –

+0

完整的問題是在主題:如何在Dart中異步讀取文件 - 或者我錯過了什麼?畢竟,這是我的第一個SO問題。 :) –

回答

3

你鏈接到的問題是關於異步閱讀多個文件的內容,這是一個更難的問題。我認爲弗洛裏安的解決方案沒有問題。簡化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..."); 
} 
3

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處理程序。