DART:未来的语法

时间:2013-12-31 17:13:11

标签: dart dart-async

我不理解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 个答案:

答案 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参数只会处理onErrorFuture块中任何同步代码的参数和错误。 <{1}}块中的任何异步代码都将保持未被捕获状态。

大多数Dart代码最近的趋势是使用then并省略then参数。

答案 1 :(得分:2)

我将尝试详细介绍Matt的答案,希望能提供更多见解。

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

例如,假设Future<String> myFuturedoSomething是接受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>