飞镖小飘飘,帮我了解期货



请参阅此代码:

class SomeClass{
String someVariable;
SomeClass();

Future<String> getData ()  async {
Response response = await get('http://somewebsite.com/api/content');

Map map = jsonDecode(response.body); // do not worry about statuscode, trying to keep it minimal
someVariable = map['firstName'];
return 'This is the first name : $someVariable';
}
}

现在看看主要:

void main(){
String someFunction() async {
SomeClass instance = SomeClass(); // creating object
String firstNameDeclaration = await instance.getData().then((value) => value); 
return firstNameDeclaration;
}
}

使用 Future 时,就像firstNameDeclaration一样,为什么我必须使用.then()方法来访问字符串对象,因为我正在等待函数完成? 在网上搜索时,有些人使用.then()其他人不使用,我很困惑。

请帮助我更清楚地了解期货和异步函数的整体工作原理。

背景

异步操作允许程序在等待另一个操作完成的同时完成工作。下面是一些常见的异步操作:

  • 通过网络获取数据。
  • 写入数据库。
  • 从文件中读取数据。

若要在 Dart 中执行异步操作,可以使用Future类以及async 和 await关键字

当异步函数调用"await"时,它将被转换为未来,并放入执行队列中。当等待的未来完成时,调用函数被标记为准备执行,并将在稍后的某个时间点恢复。重要的区别是,在此模型中不需要暂停线程。

期货与异步等待

异步函数调用">await"时,它将被转换为未来,并放入执行队列中。当等待的未来完成时,调用函数被标记为准备执行,并将在稍后的某个时间点恢复。重要的区别是,在此模型中不需要暂停线程。

async-await 只是一种定义异步函数并将其结果用于 Future 的声明性方法,它提供了语法糖,可帮助您编写涉及 Future 的干净代码。

考虑一下这个涉及期货的飞镖代码 -

Future<String> getData(int number) {
return Future.delayed(Duration(seconds: 1), () {
return 'this is a future string $number.';
});
}
main(){
getData(10).then((data) => {
print(data)
});
}

正如您在使用 Futures 时所看到的,您可以在函数返回 Future 值时使用回调。如果只有一个"then"回调,这很容易管理,但是一旦有许多嵌套的"then"回调,情况就会迅速升级,例如-

Future<String> getProductCostForUser() {
return getUser().then((user) => {
var uid = user.id;
return getOrder(uid).then((order) => {
var pid = order.productId;
return getProduct(pid).then((product) => {
return product.totalCost;
});
});
});
}
main(){
getProductCostForUser().then((cost) => {
print(cost);
});
}

当有多个链式"then"回调时,代码变得非常难以阅读和管理。此问题可通过"异步等待">解决。上面链接的"then"回调可以通过使用"async-await">来简化,如下所示 -

Future<String> getProductCostForUser() async {
var user = await getUser();
var order = await getOrder(user.uid);
var product = await getProduct(order.productId);
return product.totalCost;
}
main() async {
var cost = await getProductCostForUser();
print(cost);
}

如上所示,当存在链接的"then"回调时,代码更具可读性和易于理解。

我希望这能解释一些关于"异步等待"和期货的基本概念和理解。

您可以在此处进一步阅读有关主题和示例的信息

基本上,您应该使用awaitthen()。但是,Dart 指南提倡您应该更喜欢使用await而不是then()

此代码:

Future<int> countActivePlayers(String teamName) {
return downloadTeam(teamName).then((team) {
if (team == null) return Future.value(0);
return team.roster.then((players) {
return players.where((player) => player.isActive).length;
});
}).catchError((e) {
log.error(e);
return 0;
});
}

应替换为:

Future<int> countActivePlayers(String teamName) async {
try {
var team = await downloadTeam(teamName);
if (team == null) return 0;
var players = await team.roster;
return players.where((player) => player.isActive).length;
} catch (e) {
log.error(e);
return 0;
}
}

在您的情况下,您应该写:

void main(){
Future<String> someFunction() async {
SomeClass instance = SomeClass(); // creating object
String firstNameDeclaration = await instance.getData();
return firstNameDeclaration;
// Or directly : return await instance.getData();
// Or : return instance.getData();
}
}

最新更新