void main() async {
Future<void> asyncFunction(time, value) async {
return await Future.delayed(Duration(seconds: time), () => print(value));
}
print('1');
asyncFunction(2, "A");
asyncFunction(1, "B");
asyncFunction(0, "C");
print('2');
}
根據上面的代碼,我試圖讓代碼列印為:
1
2
A
B
C
我想同步執行所有函式,并將 asyncFunctions (Futures) 發送到某種佇列,然后按照收到的順序執行這些函式。每個函式都必須等待前一個函式完成它的 Future,然后才能執行。
我一直在嘗試使用流,但沒有做對。
uj5u.com熱心網友回復:
這行得通嗎?
void main() async {
Future<void> asyncFunction(time, value) async {
return await Future.delayed(Duration(seconds: time), () => print(value));
}
print('1');
print('2');
await asyncFunction(2, "A");
await asyncFunction(1, "B");
await asyncFunction(0, "C");
}
uj5u.com熱心網友回復:
好吧,我設法想出了一些redimentary:
import 'dart:async';
import 'dart:collection';
import 'dart:math';
var streamController = StreamController<String>();
Queue queue = Queue();
bool busy = false;
Future<void> asyncFunction(value) async {
await Future.delayed(Duration(seconds: Random().nextInt(4)));
return print(value);
}
void main() async {
streamController.stream.listen((letter) async {
queue.add(letter);
if (!busy) {
busy = true;
while (busy) {
await asyncFunction(queue.first);
queue.removeFirst();
if (queue.isEmpty) {
busy = false;
}
}
}
});
print("1");
streamController.add("A");
streamController.add("B");
streamController.add("C");
streamController.add("D");
print("2");
streamController.add("E");
streamController.add("F");
streamController.add("G");
streamController.add("H");
print("3");
print("-");
}
給出所需的結果:
1
2
3
-
A
B
C
D
E
F
G
H
uj5u.com熱心網友回復:
Future.delayed(2, ...)之前沒有辦法make完成Future.delayed(1, ...)。時間不是這樣運作的。您可以做的是依賴回傳值而不是副作用,然后您可以構建 a Listof Futures 并用于Future.wait收集結果并按原始順序列印它們:
void main() async {
Future<dynamic> asyncFunction(time, value) async {
await Future.delayed(Duration(seconds: time));
return value;
}
var futures = <Future<dynamic>>[];
print('1');
futures.add(asyncFunction(2, "A"));
futures.add(asyncFunction(1, "B"));
futures.add(asyncFunction(0, "C"));
print('2');
var results = await Future.wait(futures);
for (var result in results) {
print(result);
}
}
上述方法的好處是允許多個異步操作可能并行運行。
或者,您可以延遲構建Future.delayed(...)物件,以便在前一個完成之前不會創建每個物件:
void main() async {
Future<void> asyncFunction(time, value) async {
await Future.delayed(Duration(seconds: time), () => print(value));
}
var queue = <Future<void> Function()>[];
print('1');
queue.add(() => asyncFunction(2, "A"));
queue.add(() => asyncFunction(1, "B"));
queue.add(() => asyncFunction(0, "C"));
print('2');
for (var thunk in queue) {
await thunk();
}
}
uj5u.com熱心網友回復:
如果您想要一個異步任務佇列,其中添加的每個新任務都延遲到前一個任務完成,您可以自己撰寫一個。
class AsyncQueue<T> {
Future<T?> _current = Future.value(null);
Future<T> add(FutureOr<T> Function() task) {
FutureOr<T> wrapper(void _) => task();
return _current = _current.then(wrapper, one rror: wrapper);
}
}
您可以將其用作:
Future<void> asyncFunction(time, value) async {
await Future.delayed(Duration(seconds: time), () => print(value));
}
...
var queue = AsyncQueue<void>();
print("1");
var f1 = queue.add(() => asyncFunction(2, "A"));
var f2 = queue.add(() => asyncFunction(1, "B"));
var f3 = queue.add(() => asyncFunction(0, "C"));
print("2");
await f3;
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/318783.html
