2012-02-07 21 views
8

Trong Dart, có một khái niệm về cách ly. Tôi có một ứng dụng (mà tôi đang thử nghiệm ở Dart) có rất nhiều IO không đồng bộ trong đó mỗi cuộc gọi (chúng là các cuộc gọi cơ sở dữ liệu) phụ thuộc vào phiên bản trước đó. Vì vậy, tôi đã kết thúc trong một địa ngục gọi lại lồng nhau.Làm cách nào để thực hiện một số hành động I/O không đồng bộ trong Dart cleanly (Isolates)?

Tôi đã tự hỏi nếu Isolates có thể giải quyết súp gọi lại lồng nhau, nhưng có vẻ hơi tiết và tôi không chắc chắn nếu nó phù hợp với nó tốt.

Ngoài ra còn có máy phát điện được đề xuất trong ECMAScript Harmony tiếp theo có thể giải quyết những điều này, nhưng làm thế nào bạn hiện đang làm rất nhiều IO không đồng bộ trong Dart một cách sạch sẽ?

Trả lời

6

Bạn có thể sử dụng Future'sCompleters để chuỗi hoạt động cùng nhau. Tương lai sau trả về kết quả của một lệnh 'ls' từ một process:

Future<String> fetch(String dir) { 
    final completer = new Completer(); 
    Process process = new Process.start('ls', [dir]); 
    process.exitHandler = (int exitCode) { 
    StringInputStream stringStream = new StringInputStream(process.stdout); 
    stringStream.dataHandler =() { 
     String content = stringStream.read(); 
     completer.complete(content); 
     process.close(); 
    }; 
    }; 
    process.errorHandler = (var error) { 
    completer.completeException(error); 
    return true; 
    }; 
    return completer.future; 
}; 

mà sau đó bạn có thể chuỗi lại với nhau như thế này:.

lấy ('/') sau đó ((val) => fetch ("/ usr"). sau đó ((val) => fetch ("/ tmp")));

Không phải là giải pháp đẹp nhất nhưng đây là những gì tôi nhận được từ bây giờ.

Các vấn đề liên quan