簡體   English   中英

是否可以屈服於Dart的外部范圍?

[英]Is it possible to yield to an outer scope in Dart?

是否有可能以某種方式yield外部范圍? 是否有更慣用的方法達到相同的預期結果?

Stream<T> fetch() async* {
  bool sentLiveValue = false;

  Future<T> cached = cache.fetchValue();
  cached.then((value) {
    if (!sentLiveValue)
      yield value; // Here, I want to yield to the outer scope.
  });

  await for (T value in liveValueSource.fetch()) {
    yield value;
    sentLiveValue = true;
    cache.update(value);
  }
}

如果您想了解上下文,那么我正在使用一種可以fetch數據的類來實現數據體系結構。 上面的簡化代碼應返回一個流,該流首先包含一個緩存的值,然后包含來自實時源的值。

請注意,如果緩存比實時數據源慢(如果緩存尚不包含值,則有可能),應首先使用實時數據。 因此, await緩存值不是一種選擇。

一種解決方案是使用StreamController ,但要注意:制作自己的流很危險 -您應該處理監聽,暫停,恢復和取消。

部分實現是:

Stream<T> fetch<T>() {
  var sentLiveValue = false;
  var controller = StreamController<T>(
    onListen: () {},
    onPause: () {},
    onResume: () {},
    onCancel: () {},
  );

  cache.fetchValue().then((v) {
    if (!sentLiveValue) {
      controller.add(v);
    }
  });

  liveValueSource.fetch().listen(
    (t) {
      sentLiveValue = true;
      cache.update(t);
      controller.add(t);
    },
    onDone: () => controller.close(),
    onError: (e, st) => controller.addError(e, st),
  );

  return controller.stream;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM