3

请考虑以下代码:

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,这些 2 的 getter Futures。另一个实现此类abstract并调用Features.NET 事件系统的类。

问题是每当我运行此代码时,它都会因错误而失败,并for(int iCounter....) 与 error: 一致Future already complete

这是否意味着我只能completeFuture 一次?

4

3 回答 3

3

那是对的。Futures 是为一次性异步调用而设计的。基本上,未来只能提供一个价值。如果您希望提供多个值,那么您将需要使用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;
  });
}
于 2013-04-04T12:32:51.667 回答
2

就是这样。如果要触发多个值,则必须处理StreamStreamController。有关更多信息,请参阅引入新的 Streams API

于 2013-04-04T12:21:57.780 回答
1

是的,Completer 只能完成 Future 一次,这对我来说似乎是最明显的。Future 基本上是(读取“一个”)异步操作的令牌。它要么成功,要么失败。

在您的情况下,您正在寻找的是一种观察者模式,其中有一个调度事件的源和一个侦听源上的事件的侦听器。在这种情况下,源可以多次分派相同的事件。

编辑:我正要添加一些指向 Streams API 的链接,但 Alexandre 打败了我。查看API 文档以获取更多信息。

于 2013-04-04T12:21:24.067 回答