我目前有一个看起来像这样的方法:
typedef void MyCallback(int status, String body);
void makeRequest(String url, MyCallback callback) async {
if( someCondition ){
callback(1, '');
}
Response response = await http.get(url);
if( response.httpCode == 200 ){
callback(2, response.body);
}
else{
callback(3, '');
}
}
我想摆脱回调,以便我可以等待makeRequest
的结果。但是,如果我只是让它返回Future
,那么我将不能返回多次。
我研究了使用流,但是看起来有点复杂。因此,基本上,我正在寻找与Future
一样方便的东西,但它可能会收到“部分结果”,即收到一个以上的结果。为了说明:
MultiFuture<int> makeRequest(String url){
MultiFuture result = new MultiFuture();
if( someCondition ){
result.value(1);
}
http.get(url).then((response){
if( response.httpCode == 200 ){
result.value(2);
}
else{
result.value(3);
}
result.finish();
});
return result;
}
MultiFuture requestResult = makeRequest('https://example.com');
await requestResult.onValue((int value){
print('value: $value');
});
// When result.finish() is called, the await is finished
使用流是我的最佳选择,还是我只是不知道某种MultiFuture
?
答案 0 :(得分:0)
从异步方法返回多个结果正是流所要做的。这是我根据您的代码制作的一个示例,因此您可以更轻松地理解它的工作原理:
class MultiFuture {
StreamController<int> _resultController = StreamController<int>();
Stream<int> get requestResult => _resultController.stream;
void makeRequest(String request) async {
if (true) {
_resultController.sink.add(1);
}
// mock request
await Future.delayed(Duration(seconds: 3));
if (true) {
_resultController.sink.add(2);
} else {
_resultController.sink.add(3);
}
}
void example() {
makeRequest("https://example.com");
requestResult.listen((value) {
print('value: $value');
});
}
}
您可以调用MultiFuture()。example();
但我建议您观看以下简单的短片,以更好地了解自己的想法: Async Coding With Dart