Flutter可取消的异步请求(只是取消结果的接受)

void main() async {
  CancelableTask<String> cancelableTask = CancelableTask();
  cancelableTask.startTask(operater()).then((value) {
    print("yyyyy:$value");
  }).catchError((e) {
    print('xxxxx e $e');
  });
}

Future<String> operater() async {
  await Future.delayed(Duration(seconds: 6)).timeout(Duration(seconds: 4));
  print('over');
  return 'operater';
}

class CancelableTask<T> {
  Completer<T>? _completer;
  final timeout = 30;

  Future<T> startTask(Future<T> future) {
    _completer = Completer();
    future.then((value) {
      print("then");
      if (!(_completer?.isCompleted ?? true)) {
        _completer?.complete(value);
      }
    }).catchError((e, s) {
      print("catchError");
      if (!(_completer?.isCompleted ?? true)) {
        _completer?.completeError(e ?? 'error');
      }
    }).timeout(Duration(seconds: timeout), onTimeout: () {
      print("timeout");
      if (!(_completer?.isCompleted ?? true)) {
        _completer?.completeError('timeout');
      }
    });
    return _completer!.future;
  }

  void cancelTask() {
    if (!(_completer?.isCompleted ?? true)) {
      _completer?.completeError('cancel');
    }
    _completer = null;
  }
}

 

posted @ 2025-07-02 15:57  呢哇哦比较  阅读(17)  评论(0)    收藏  举报