从异步方法返回多个结果?

时间:2019-10-08 18:29:44

标签: flutter dart dart-async

我目前有一个看起来像这样的方法:

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

1 个答案:

答案 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