DART: 未来 then 的语法

26

我不理解then()子句的语法。

1. myFuture(6).then((erg) => print(erg))

(erg) => expr的语法结构是什么?

我认为它可能是一个函数,但是......

then( callHandler2(erg)

无法工作,错误:

"Multiple markers at this line
- The argument type 'void' cannot be assigned to the parameter type '(String) -> 
 dynamic'
- Undefined name 'erg'
- Expected to find ')'"

2. myFuture(5).then((erg) {callHandler(erg);}, onError: (e) => print(e))

What´s `onError: (e) => expr"` syntactically?

3. onError:.catchError(e) 这两种方式有什么区别吗?

2个回答

38

1) 胖箭头(Fat Arrow)是对短匿名函数的一种语法糖。下面这两个函数是相同的:

someFuture(arg).then((erg) => print(erg));
// is the same as
someFuture(arg).then((erg) { return print(erg); });

基本上fat arrow会自动返回下一个表达式的求值结果。

如果你的callHandler2函数有正确的签名,你可以直接传递函数名。签名指它接受与未来将传递给then从句的参数数量相同的参数,并返回null/void。

例如,以下内容将起作用:

void callHandler2(someArg) { ... }
// .. elsewhere in the code
someFuture(arg).then(callHandler);

2) 参见答案1)。粗箭头(fat arrow)只是一种等同于以下代码的语法糖:

myFuture(5).then( (erg){ callHandler(erg);}, onError: (e){ print(e); });

3) catchError允许您在一系列Futures之后链接错误处理。首先,了解可以链接then调用,因此返回Futurethen调用可以链接到另一个then调用。catchError将捕获链中所有Future的同步和异步错误。传递onError参数仅处理Future中的错误以及then块中任何同步代码的错误。 then块中的任何异步代码都将保持未捕获状态。

最近Dart代码中的趋势是使用catchError并省略onError参数。


谢谢,回答了我所有的问题。在(1)中,我首先尝试了带有参数的.then(callHandler(erg)),但失败了。 - mica

10

我将尝试更详细地阐述Matt的回答,希望能提供更多见解。

then() 所需的是一个函数(回调),其签名与 future 的类型匹配。

例如,对于给定的 Future<String> myFuture 和任何接受 String 输入的函数 doSomething,您可以调用 myFuture.then(doSomething)。现在,在Dart中有几种定义接受String的函数的方法:

Function(String) doSomething1 = (str) => /* do something with str */  // only one command
Function(String) doSomething2 = (str) { /* do something with str */ } // several commands
Function(String) doSomething3 = myFunction;
myFunction(String) { // Dart will auto imply return type here
  /* do something with str */ // several commands
}
任何这三个函数定义(=的右侧)都可以放在then()中。前两个定义被称为lambda函数,它们在运行时创建,不能被重用,除非您手动复制代码。Lambda函数可能会产生类似语言的表达式,例如(connection) => connection.connect() 。第三种方法允许函数被重用。Lambda函数在许多语言中很常见,您可以在此处阅读有关它的更多信息:https://medium.com/@chineketobenna/lambda-expressions-vs-anonymous-functions-in-javascript-3aa760c958ae
之所以不能将callHandler2(erg)放在then()中是因为callHandler2(erg)使用了未定义的变量erg。使用lambda函数,您将能够告诉then()callHandler2(erg)中的erg是未来的输出,因此它知道从哪里获取erg值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接