Flutter异步调用管理插件async_call_queue的使用
Flutter 异步调用管理插件 async_call_queue 的使用
async_call_queue
AsyncCallQueue
是一个 Dart 类,它提供了一个队列机制来防止并发访问异步代码。
开始使用
在你的应用的 pubspec.yaml
文件中添加以下依赖:
dependencies:
async_call_queue: ^1.0.0
然后在你的 Dart 文件中导入该包:
import 'package:async_call_queue/async_call_queue.dart';
接下来,你可以在适当的地方使用 AsyncCallQueue
。
示例代码
示例 1
这是控制示例。delayedWrite1234To
函数会将数组 [1, 2, 3, 4]
中的每个数字写入字符串缓冲区,并在每次写入前延迟一定毫秒数。两次连续调用应该产生 '11223344'
。
var buff = StringBuffer();
var f1 = delayedWrite1234To(buff);
var f2 = delayedWrite1234To(buff);
await Future.wait<void>([f1, f2]);
expect(buff.toString(), '11223344');
示例 2
这验证了 queueCall
会同步对 delayedWrite1234To
的调用,使得第一个调用完成后再执行第二个调用,结果应该是 '12341234'
。
var acq = AsyncCallQueue();
buff = StringBuffer();
f1 = acq.queueCall<void>((acq, callId) => delayedWrite1234To(buff));
f2 = acq.queueCall<void>((acq, callId) => delayedWrite1234To(buff));
await Future.wait<void>([f1, f2]);
acq.dispose();
expect(buff.toString(), '12341234');
示例 3
这验证了第一个调用可以在下一个调用开始等待时取消部分工作。我们延迟第二个调用两毫秒,因此结果应为 '121234'
。
acq = AsyncCallQueue();
buff = StringBuffer();
f1 = acq.queueCall<void>((acq, callId) async {
for (final value in [1, 2, 3, 4]) {
await _delayedWriteTo(buff, value);
if (acq.hasCallsWaitingAfter(callId)) return;
}
});
await Future<void>.delayed(twoMilliseconds);
f2 = acq.queueCall<void>((acq, callId) => delayedWrite1234To(buff));
await Future.wait<void>([f1, f2]);
acq.dispose();
expect(buff.toString(), '121234');
示例 4
在这个示例中,只有最后一个调用会完成,因为我们每毫秒创建一个新的调用,而延迟为 5 毫秒。
final buff = StringBuffer();
final acq = AsyncCallQueue();
final completer = Completer<void>();
for (var c = 0; c < 10; c++) {
await Future<void>.delayed(oneMillisecond);
acq.delayCall((acq, callId) {
buff.write(callId);
completer.complete();
}, delay: fiveMilliseconds);
}
await completer.future;
acq.dispose();
expect(buff.toString(), '10');
辅助函数
以下是辅助函数的实现:
/// 在 [buff] 中延迟写入 [value]。
Future _delayedWriteTo(
StringBuffer buff,
int value, {
Duration delay = oneMillisecond,
}) async {
await Future<void>.delayed(delay);
buff.write(value);
}
/// 将值 1, 2, 3, 4 写入 [buff],并在每个数字写入前延迟。
Future delayedWrite1234To(
StringBuffer buff, {
Duration delay = oneMillisecond,
}) async {
for (final value in [1, 2, 3, 4]) {
await _delayedWriteTo(buff, value, delay: delay);
}
}
更多关于Flutter异步调用管理插件async_call_queue的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复