25

我不明白该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)变体有区别吗?

4

2 回答 2

33

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返回 a 的调用 Future可以链接到另一个then调用。catchError将从Future链中的所有 s 中捕获同步和异步错误。传递onError参数只会处理块Future中任何同步代码的参数中的错误。then块中的任何异步代码then都不会被捕获。

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

于 2013-12-31T18:31:43.063 回答
9

我将尝试详细说明马特的答案,希望能提供更多见解。

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

例如,给定 aFuture<String> myFuturedoSomething是任何接受String输入的函数,您可以调用myFuture.then(doSomething). 现在,有几种方法可以String在 Dart 中定义一个接受 a 的函数:

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()inergcallHandler2(erg)未来的输出,因此它知道从哪里获取erg值。

于 2019-11-25T15:20:15.313 回答