2013-06-05 29 views
1

如何從未來對象返回未來價值? 此代碼不起作用。如何從未來回報未來?或者這是禁止在異步庫?

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>>(); 

然後用指定爲Future<int>T類型的結果從通用類的未來預期?

我結果必須是在類型參數T中指定的。

Future<int>.

但結果並不如預期。 在Dart API網站上找不到關於此異常行爲的信息。

如果這是一個「功能」(但我認爲這不正常的行爲錯誤地稱之爲「功能「),那麼爲什麼它沒有在DART API文檔?

如何解釋這種差異?

爲什麼此代碼不會產生錯誤和警告?

另一個相同的例子,但W/O使用未來。

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時(即意想不到的),那麼我們如何調用這些代碼? 正常還是異常?

或者,也許在鏢一些特殊的(神奇)的未來?

回答

3

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

它說:

我想這意味着你不能從未來返回的未來。 但是你可以返回期貨的列表。

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)]; 
    }); 
} 
2

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

如果返回值本身是(未來),創建 未來的建成,將等到返回的將來完成,並會再 具有相同的結果完成。

這意味着你可以重寫你的代碼爲:

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); 
    }); 
} 

這是很多吸塵器工作,並提供了預期的結果。

+0

回到未來實際會很快使人們無法在複雜的代碼庫利用期貨。嵌套多個期貨會使代碼難以閱讀並且難以使用。我很高興Dart團隊以這種方式實施了Futures。任何關於不符合標準仿製藥處理的擔憂均由文件中關於如何處理退貨期貨的明確說明處理。 –

+0

programmers.stackexchange.com是理論討論的適當場所。 –