【问题标题】:using Future .then(_) with "return" in Dart language在 Dart 语言中使用 Future .then(_) 和“return”
【发布时间】:2014-10-16 20:43:40
【问题描述】:

我有一个自定义元素,其中一个函数在返回元素之前从服务器调用 SQL 语句。问题是:执行SQL需要很长时间,所以函数返回NULL元素,稍后完成SQL。

初始代码为:

  Element launchElement(){
        getItems();
        return(innerDiv);
    }

但由于这个问题,我尝试如下使用 Future 来控制它

  Element launchElement(){
     Future fonixFuture() => new Future.value(true);
     fonixFuture()
            .then((_)=> getItems())
            .then((_)=> return(innerDiv));
 }

但在 Dart 编辑器中出现了一长串错误,如下所示:

Multiple markers at this line
- Expected to find 
 ';'
- Expected to find 
 ';'
- Expected to find 
 ';'
- Dead code
- Unexpected 
 token ')'
- Expected an 
 identifier
- Expected an 
 identifier
- Expected to find 
 ')'

get item 函数是对服务器的简单调用以从 SQL 中获取输出:

 getItems(){  
    request = new HttpRequest();
    request.onReadyStateChange.listen(onData_getItems);

    request.open('POST', host+'/getItems');
    request.send(' ');  
  }

  onData_getItems(_){
    if (request.readyState == HttpRequest.DONE && request.status == 200) {   

     for(Map item in JSON.decode(request.responseText)){
         LineItem..children.add(new OptionElement(value: item['Code'], data: item['Name']));
    }         
} 
else if (request.readyState == HttpRequest.DONE &&
  request.status == 0) { 
     fonixFooter.classes..add('serverERROR');
     fonixFooter.innerHtml= "could not connect to server, contact your admin";  
}
else
  { 
     fonixFooter.classes..add('serverERROR');
     fonixFooter.innerHtml= "Failed to fetch data from server, contact your admin";  
  }

}

自定义元素本身是:

class purchaseLines extends HtmlElement {
    static final tag = 'purchase-lines';
    factory purchaseLines() => new Element.tag(tag);

    var innerDiv, LineItem;

    purchaseLines.created() : super.created() {      
        innerDiv = new cardFonix().launchElement();

        LineItem = new SelectElement()
              ..children.add(new OptionElement(value: '0', data:'Stock Code'));

         var LineQty = new InputElement()
                  ..type='number'
                   ..placeholder='Qty'  ;   

        LineQty.onKeyUp.listen((e){if(LineQty.checkValidity() == false)LineQty.value='0';});
        var Lineprice = new InputElement()
             ..type='number'
             ..placeholder='price';

          Lineprice.onKeyUp.listen((e){if(Lineprice.checkValidity() == false)Lineprice.value='0';});
          innerDiv.nodes..add(LineItem)..add(LineQty)..add(Lineprice); 
    }

有什么想法吗?

【问题讨论】:

  • getItems 方法的签名是什么?这必须返回一个 Future 才能使该方案起作用。
  • @SethLadd 我在问题中添加了更多代码,希望对您有所帮助。

标签: dart future


【解决方案1】:

这不是合法的语法:

.then((_) => return(innerDiv));

在 Dart 中,return 不是函数。我想也许你只是想要这个:

.then((_) => innerDiv);

您的函数调用应如下所示:

Future<Element> launchElement(){
  return new Future.value(true)
        .then((_) => getItems())
        .then((_) => innerDiv);
}

【讨论】:

  • 它给了我:这个函数声明了一个返回类型'Element',但不以返回语句结束
  • 我已经修改了答案以显示如何从函数返回。
猜你喜欢
  • 1970-01-01
  • 2020-06-19
  • 2021-06-13
  • 1970-01-01
  • 2017-11-02
  • 1970-01-01
  • 2019-09-10
  • 2021-02-23
  • 1970-01-01
相关资源
最近更新 更多