簡體   English   中英

如何從未來中回報未來? 還是異步庫中禁止這樣做?

[英]How return Future from Future? Or this is prohibited in async library?

如何從Future對象返回Future價值? 此代碼不起作用。

import 'dart:async';

    void main() {
      var temp = foo();
      temp.then((Future<int> future) {
        future.then((int result) {
          print(result);
        });
      });
    }

    Future<Future<int>> foo() {
      return new Future<Future<int>>(() {
        return new Future<int>(() => 5);
      });
    }

如何防止不必要的拆包?

在這種情況下,在異步庫“ Future”中聲明為通用類。

abstract class Future<T> {
}

如果我創建如下表達式

new Future<Future<int>>();

然后,將類型T指定為Future<int> ,從泛型類Future中獲得什么結果?

我認為結果必須與類型實參T指定的一樣。

Future<int>.

但是結果卻不如預期。 在Dart API網站上找不到有關此異常行為的信息。

如果這是一個“功能”(但我認為異常行為錯誤地稱為“功能”),那么為什么它沒有在Dart API中記錄呢?

如何解釋這種差異?

為什么此代碼未生成錯誤和警告?

另一個相同的示例,但未使用Future。

void main() {
  var temp = foo();
  temp.baz((Foo<int> foo) {
    foo.baz((int result) {
      print(result);
    });
  });
}

Foo<Foo<int>> foo() {
  return new Foo<Foo<int>>(() {
    return new Foo<int>(() => 5);
  });
}

如果在這種情況下結果與使用Future時一樣(即意外),那么我們如何調用此代碼? 正常還是異常?

還是Dart的未來有些特殊(魔術)?

查看api文檔http://api.dartlang.org/docs/releases/latest/dart_async/Future.html

它說:

If the returned value is itself a Future, completion of the created future will wait until
the returned future completes, and will then complete with the same result.

我想這意味着您無法從未來返回未來。 但是您可以返回一份期貨清單。

void main() {
  var temp = foo();
  temp.then((List<Future<int>> list) {
    list[0].then((int result) {
      print(result);
    });
  });
}

Future<List<Future<int>>> foo() {
  return new Future<List<Future<int>>>(() {
    return [new Future<int>(() => 5)];
  });
}

不需要任何額外的包裝。 根據未來文檔:

如果返回的值本身是[Future],則創建的Future的完成將等待,直到返回的Future完成,然后將以相同的結果完成。

這意味着您可以將代碼重寫為:

import 'dart:async';

void main() {
  var temp = foo();
  temp.then((int result) {
    print(result);        
  });
}

Future<int> foo() {
  return new Future<int>(() {
    return new Future<int>(() => 5);
  });
}

這可以更清潔地工作,並提供預期的結果。

暫無
暫無

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

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