flutter 有没有可能在不使总延迟超过函数本身所花费的时间的情况下,给一个函数增加一些延迟?

zz2j4svz  于 2023-10-22  发布在  Flutter
关注(0)|答案(1)|浏览(99)

我有一个函数,它发出一个API调用,通常在50毫秒到6秒之间的任何延迟之后收到响应。如果API调用在1500毫秒内完成,我希望结果在1500毫秒内准确到达,如果API响应在1500毫秒后完成,它应该在收到响应后立即返回结果。
我试着用这个:

final result = await Future.delayed(Duration(milliseconds: 1500,() async => await apiCall();

但这样做的问题是,apiCall()函数只有在1500 mils的延迟之后才被调用。
在dart中有没有直接的方法来实现这一点?有人试过吗?

jfgube3f

jfgube3f1#

创建一个helper函数来测量API调用所花费的时间,然后在返回结果之前添加适当的延迟,这是相当简单的:

Future<R> callWithMinimumDuration<R>(
  Future<R> Function() func,
  Duration minimumDuration,
) async {
  var stopwatch = Stopwatch()..start();
  var result = await func();
  var delta = minimumDuration - stopwatch.elapsed;
  if (delta > Duration.zero) {
    await Future.delayed(delta);
  }
  return result;
}

然后你会调用它:

var result = await callWithMinimumDuration(apiCall, Duration(milliseconds: 1500));

或者,您可以使用Future.wait将原始FutureFuture.delayed组合。但是,Future.wait希望Future具有异构类型,因此您需要转换(无论是显式还是隐式,如果允许隐式dynamic转换):

Future<R> callWithMinimumDuration<R>(
  Future<R> Function() func,
  Duration minimumDuration,
) async =>
    (await Future.wait<Object?>([func(), Future.delayed(minimumDuration)]))[0]
        as R;

或者使用an assignment technique to deal with heterogeneous Future s

Future<R> callWithMinimumDuration<R>(
  Future<R> Function() func,
  Duration minimumDuration,
) async {
  late R result;
  await Future.wait([
    () async {
      result = await func();
    }(),
    Future.delayed(minimumDuration),
  ]);
  return result;
}

您也可以使用one of the .wait extensions,但正确的错误处理将需要更多的工作:

Future<R> callWithMinimumDuration<R>(
  Future<R> Function() func,
  Duration minimumDuration,
) async {
  try {
    return (await (func(), Future.delayed(minimumDuration)).wait).$1;
  } on ParallelWaitError catch (e, st) {
    Error.throwWithStackTrace(e.errors.$1, st);
  }
}

相关问题