2013-08-24 28 views
12

là bạn có thể tạo tương lai của riêng bạn trong Dart để trả về từ các phương pháp của bạn hay bạn phải luôn trả về được xây dựng trong tương lai trở về từ một trong các phương thức thư viện không đồng bộ phi tiêu?Phi tiêu, cách tạo một tương lai để trở lại chức năng của riêng bạn?

Tôi muốn xác định một chức năng mà luôn luôn trả về một Future<List<Base>> dù nó thực sự làm một cuộc gọi async (file đọc/ajax/etc) hoặc chỉ nhận được một biến địa phương, như sau:

List<Base> aListOfItems = ...; 

Future<List<Base>> GetItemList(){ 

    return new Future(aListOfItems); 

} 

Trả lời

20

Nếu bạn cần để tạo một tương lai, bạn có thể sử dụng Completer. Xem Completer class trong tài liệu. Dưới đây là ví dụ:

Future<List<Base>> GetItemList(){ 
    var completer = new Completer(); 

    // At some time you need to complete the future: 
    completer.complete(new List<Base>()); 

    return completer.future; 
} 

Nhưng hầu hết thời gian bạn không cần phải tạo tương lai với người hoàn thành. Giống như trong trường hợp này:

Future<List<Base>> GetItemList(){ 
    var completer = new Completer(); 

    aFuture.then((a) { 
    // At some time you need to complete the future: 
    completer.complete(a); 
    }); 

    return completer.future; 
} 

Mã có thể trở nên rất phức tạp khi sử dụng trình hoàn tất. Bạn chỉ có thể sử dụng sau đây thay vào đó, vì then() trả về một Future, quá:

Future<List<Base>> GetItemList(){ 
    return aFuture.then((a) { 
    // Do something.. 
    }); 
} 

Hoặc một ví dụ cho file io:

Future<List<String>> readCommaSeperatedList(file){ 
    return file.readAsString().then((text) => text.split(',')); 
} 

Xem this blog post cho thêm lời khuyên.

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