gpt4 book ai didi

dart - Future/Completer 只能调用一次?

转载 作者:行者123 更新时间:2023-12-04 19:55:06 24 4
gpt4 key购买 nike

请考虑以下代码:

import 'dart:async';

abstract class ClassAbstract
{
Completer<String> _onEvent1;
Completer<int> _onEvent2;

ClassAbstract()
{
_onEvent1 = new Completer<String>();
_onEvent2 = new Completer<int>();
}

Future get Event1
{
return _onEvent1.future;
}

Future get Event2
{
return _onEvent2.future;
}
}

class NormalClass extends ClassAbstract
{
NormalClass(): super()
{
_onEvent1.complete("Event1 rise");
for (int iCounter = 0; iCounter < 100; iCounter++)
{
_onEvent2.complete(iCounter);
}
}
}


void main() {

NormalClass normalClass = new NormalClass();

normalClass.Event1.then( (val) { print("Event1 rised"); } );
normalClass.Event2.then( (val) { print("Event2 rised: $val"); } );

print("Application close");
}

如您所见,这是一个非常简单的代码,其中包含 1 个 abstract 类,其中定义了 2 个 Futures,这两个 Futures 的 getter。另一个实现这个abstract类并调用Features来模拟.NET事件系统的类。

问题是每当我运行此代码时,它都会在 for(int iCounter....) 行中出现错误并出现错误:Future already complete

是否意味着我只能完成 Future 一次?

最佳答案

没错。 Futures 是为一次性异步调用而设计的。基本上, future 只能提供一个值(value)。如果您希望提供多个值,那么您将需要使用 Stream .使用 StreamController您可以轻松添加多个可以订阅的值。

所以你的样本应该是这样的:

import 'dart:async';

abstract class ClassAbstract
{
StreamController<String> _onEvent1;
StreamController<int> _onEvent2;

ClassAbstract()
{
_onEvent1 = new StreamController<String>();
_onEvent2 = new StreamContorller<int>();
}

Future get Event1
{
return _onEvent1.stream;
}

Future get Event2
{
return _onEvent2.stream;
}
}

class NormalClass extends ClassAbstract
{
NormalClass(): super()
{
_onEvent1.add("Event1 rise");
for (int iCounter = 0; iCounter < 100; iCounter++)
{
_onEvent2.add(iCounter);
}
}
}

可以这样称呼:

main() {
var sum = 0;
var thing = new NormalClass();
thing.Event1.listen((myStr) => print(myStr));
thing.Event2.listen((val) {
sum += val;
});
}

关于dart - Future/Completer 只能调用一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15810267/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com