2013-02-11 35 views
5

Làm cách nào để nhận kết quả của Future ngay lập tức? Ví dụ:Có cách nào để chạy Tương lai của Dart không?

void main() { 
    Process.run('some_shell_command', []).then((ProcessResult result) { 
    print(result.stdout); // I have the output here... 
    }); 
    // ... but want it here. 
} 
+0

Tôi không thấy cách dễ dàng để thực hiện điều đó. Vấn đề với việc sử dụng gọi lại là gì? Bạn chỉ đang cố gắng làm giảm gọi lại lồng nhau? –

+0

Chỉ muốn biết liệu có thể. – Leksat

Trả lời

2

Xin lỗi, đơn giản là không thể.

Có một số trường hợp một hàm trả về new Future.immediate(value) và hình dung bạn có thể nhận được giá trị, nhưng:

  1. Đây không phải là một trong những trường hợp đó. Các tiến trình được chạy hoàn toàn không đồng bộ bởi máy ảo.
  2. Khả năng truy cập trực tiếp giá trị của tương lai đã bị xóa trong bản cập nhật libv2.

Cách xử lý này là có chức năng chứa Process.run() trả về Tương lai và thực hiện tất cả logic của bạn trong hàm gọi lại, có vẻ như bạn biết, vì vậy tôi giả định rằng mã của bạn ở đây chỉ là một ví dụ và bạn không thực sự làm điều này trong main(). Trong trường hợp đó, thật không may, bạn về cơ bản không may mắn - bạn phải làm cho chức năng của bạn không đồng bộ nếu bạn phụ thuộc vào việc biết giá trị tương lai hoặc hoạt động đã hoàn thành.

Không đồng bộ trong môi trường một luồng, như Dart và Javascript, là vi-rút và luôn truyền bá ngăn xếp cuộc gọi của bạn. Mỗi hàm gọi hàm này và mọi hàm gọi chúng, v.v., phải là không đồng bộ.

2

số

Toàn bộ điểm của API acync khi hoạt động không đồng bộ kết thúc, mã của bạn nhận kết quả dưới dạng gọi lại.

Một cách khác để viết mã của bạn, nếu bạn đang tìm cách để giảm làm tổ, có thể là bởi đi qua trong một chức năng để các then()

void main() { 
    Process.run('some_shell_command', []).then(doSomethingWithResult); 
} 

void doSomethingWithResult(result) { 
    print(result.stdout); // I have the output here... 
} 
5

the support of await đang trong trạng thái thử nghiệm và có thể được sử dụng như:

void main() async { 
    ProcessResult result = await Process.run('some_shell_command', []); 
    print(result.stdout); // I have the output here... 
} 
+0

Xem thêm http://stackoverflow.com/questions/27212220 –

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