我目前有一个看起来像这样的方法:
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
我只是不知道?
从异步方法返回多个结果正是流的作用。这是我根据您的代码制作的示例,以便您更容易理解其工作原理:
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(); 来测试它
但我建议您观看这些简单的短片以获得更好的想法:使用 Dart 进行异步编码
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)