我不理解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)
变种之间是否存在差异?
答案 0 :(得分:5)
1) Fat Arrow 是短匿名函数的语法糖。以下两个功能相同:
someFuture(arg).then((erg) => print(erg));
// is the same as
someFuture(arg).then((erg) { return print(erg); });
基本上胖箭头基本上会自动返回下一个表达式的评估。
如果您的callHandler2
具有正确的签名,则只需传递函数名称即可。签名是它接受参数的数量,因为将来将传递给then
子句,并返回null / void。
例如,以下内容将起作用:
void callHandler2(someArg) { ... }
// .. elsewhere in the code
someFuture(arg).then(callHandler);
2)见答案1)。 胖箭头只是语法糖,相当于:
myFuture(5).then( (erg){ callHandler(erg);}, onError: (e){ print(e); });
3)catchError
允许您在一系列期货之后链接错误处理。首先,了解then
来电可以被链接很重要,因此返回then
的{{1}}来电可以链接到另一个Future
来电。 then
将捕获链中所有catchError
的同步和异步错误。传递Future
参数只会处理onError
中Future
块中任何同步代码的参数和错误。 <{1}}块中的任何异步代码都将保持未被捕获状态。
大多数Dart代码最近的趋势是使用then
并省略then
参数。
答案 1 :(得分:2)
我将尝试详细介绍Matt的答案,希望能提供更多见解。
then()
所需要的是一个函数(回调),其签名与将来的类型匹配。
例如,假设Future<String> myFuture
和doSomething
是接受String
输入的任何函数,则可以调用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
}
这3个函数定义(=
的右侧)中的任何一个都可以放在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()
erg
中的callHandler2(erg)
是未来的输出,因此它知道从何处获取erg
的值。 / p>