在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。
网友评论