【问题标题】:DART: syntax of future thenDART:未来的语法 then
【发布时间】:2013-12-31 17:13:10
【问题描述】:

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

【问题讨论】:

    标签: dart dart-async


    【解决方案1】:

    1) 胖箭头 是短匿名函数的语法糖。下面两个函数是一样的:

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

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

    【讨论】:

    • tnx,回答了我所有的问题,在(1)中我首先尝试了带有参数的 .then(callHandler(erg)),但失败了。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-18
      • 1970-01-01
      • 2022-10-23
      • 1970-01-01
      • 2015-08-20
      • 1970-01-01
      • 2019-12-19
      • 2014-03-31
      相关资源
      最近更新 更多