了解一下dart中的Future

2020-04-26  本文已影响0人  健健可迪仔

    在flutter开发中我们大量使用Future,特别是异步编程中,如果一个Fuction被async修饰,则该Fuction将会返回一个Future,Future的运行值即该Fuction的返回值。在调用这种的方法的时候可以以同步方式调用(调用的时候使用await关键字修饰),也可以异步调用(Future.then的方式)的方式进行调用,窃以为Future的引入将面向函数编程的理念提高了很多个量级,那么我们就来了解一下Future的一些常用构造方法以及用法吧:
    Future表示延迟运行的对象,用来表示一个潜在的值返回或错误返回,这个返回值将在未来的某个时刻才可用。Future的调用者可以注册回调,一旦返回值或错误可用,就可以通过回调函数对其进行处理。
    Future可以通过两种方式完成:一种是有值的(“未来成功”),另一种是有错误的(“未来失败”)。调用者可以为每种情况设置回调函数。
    在某些情况下,我们可以将一个Future紧接着另一个Future完成,就是说Future的调用可以使成串的。但是当future在完成时出现错误,而且它没有后续与之串起来的Future,则这个错误消息将会被转发给全局错误处理程序。这种机制确保了错误不会被自动删除,但是,这也意味着开发者应该尽早注册错误处理函数以便Future一旦返回error,error处理程序就会立进行处理。
    在注册回调函数时,通常会同时设置正常返回值的处理函数以及catchError处理函数,每一种函数都将把它们处理结果转发给它们的下一个Future,并进一步处理返回值或error结果,使用串联的Future通常会使代码更容易理解;当然我们还可以将异步代码写成是同步代码的代码的方式(通过async和await关键字),这样可以使代码的结构变得很简单。Future叶可能永远不会执行结束,在这种情况下,回调函数将不会被执行。Future的构造方法说明:

1、Future(FutureOr<T> computation())

  factory Future(FutureOr<T> computation()) {
    _Future<T> result = new _Future<T>();
    Timer.run(() {
      try {
        result._complete(computation());
      } catch (e, s) {
        _completeWithErrorCallback(result, e, s);
      }
    });
    return result;
  }

创建包含使用Timer.run异步调用计算结果的Future。如果执行过程抛出异常,则future将返回错误。如果返回的值本身也是一个Future,则创建的Future的完成将后继续等待返回的Future执行完成,然后将返回相同类型的结果。如果返回一个非未来值,则返回的Future将使用该值作为返回值。

2、Future.delayed(Duration duration, [FutureOr<T> computation()])

  factory Future.delayed(Duration duration, [FutureOr<T> computation()]) {
    _Future<T> result = new _Future<T>();
    new Timer(duration, () {
      if (computation == null) {
        result._complete(null);
      } else {
        try {
          result._complete(computation());
        } catch (e, s) {
          _completeWithErrorCallback(result, e, s);
        }
      }
    });
    return result;
  }

    创建在延迟一定时间后运行的Future。computation将在给定的时间后执行。如果computation返回的又是一个Future,则此构造函数返回的Future将与该Future的值或错误一起完成后返回。如果持续时间为0或更少,则在所有微任务运行之后运行,它不会在下一个事件循环迭代中运行。如果省略computation,Future将最终使用null值返回。如果调用computation抛出异常,则创建的Futuren将返回错误。

3、Future.microtask(FutureOr<T> computation())

factory Future.microtask(FutureOr<T> computation()) {
  _Future<T> result = new _Future<T>();
  scheduleMicrotask(() {
    try {
      result._complete(computation());
    } catch (e, s) {
      _completeWithErrorCallback(result, e, s);
    }
  });
  return result;
}

    创建包含使用scheduleMicrotask异步调用计算的结果的Future。如果执行computation抛出异常,则返回的future将返回错误。如果computation本身又返回一个Future,则创建的Future的完成后将继续等待返回的Future完成,然后将使用相同类型的结果进行返回。如果computation返回一个非future值,则返回的future将使用该值返回。

4、 Future.value([FutureOr<T> value])

  factory Future.value([FutureOr<T> value]) {
    return new _Future<T>.immediate(value);
  }

    创建一个有值返回的Future。如果返回值又是Future,则创建的Future将等待返回的future完成后将相同类型的结果返回。因为一个value future可以在错误的情况下返回,所以future.value创建的future也可以返回。如果value不是Future,则创建的Future将使用value值返回,相当于new Future<T>.sync(()=>value)。

5、Future.sync(FutureOr<T> computation())

factory Future.sync(FutureOr<T> computation()) {
  try {
    var result = computation();
    if (result is Future<T>) {
      return result;
    } else {
      return new _Future<T>.value(result);
    }
  } catch (error, stackTrace) {
    var future = new _Future<T>();
    AsyncError replacement = Zone.current.errorCallback(error, stackTrace);
    if (replacement != null) {
      future._asyncCompleteError(
          _nonNullError(replacement.error), replacement.stackTrace);
    } else {
      future._asyncCompleteError(error, stackTrace);
    }
    return future;
  }
}

    返回包含立即调用计算结果的future。如果computation抛出异常,则返回的future将返回错误。如果computation返回Future<T>,则返回该Future。如果computation返回一个非future值,则返回已完成运行的future。

上一篇下一篇

猜你喜欢

热点阅读