Dart 异步的优点和缺点是什么,何时使用和何时不使用它,还有什么其他的回调替代方案? 回调、异步方法或其他选项

Dart 异步的优点和缺点是什么,何时使用和何时不使用它,还有什么其他的回调替代方案? 回调、异步方法或其他选项,dart,Dart,回调瘟疫的解决方案是“wait”和“async”或更具体的“dart:async”库 现在,异步的代价是什么? 我们什么时候不应该使用它们? 其他的选择是什么 下面是一个编码错误的非聚合自定义元素,其作用类似于桌面环境中的messageBox。它给了我更少的大括号和圆括号,但要求调用方也是异步的,或者使用“show()。然后((v){print(v);});”模式。我应该避免这样的模式吗 回调更好吗?还是有更聪明的方法 轮询版本 导入'dart:html'; 导入“dart:async”; vo

回调瘟疫的解决方案是“wait”和“async”或更具体的“dart:async”库

现在,异步的代价是什么?
我们什么时候不应该使用它们?
其他的选择是什么

下面是一个编码错误的非聚合自定义元素,其作用类似于桌面环境中的messageBox。它给了我更少的大括号和圆括号,但要求调用方也是异步的,或者使用“show()。然后((v){print(v);});”模式。
我应该避免这样的模式吗
回调更好吗?还是有更聪明的方法

轮询版本
导入'dart:html';
导入“dart:async”;
void init(){
文件.注册表项('list-modal',ListModal);
}
类ListModal扩展了HtmleElement{
ListModal.created():super.created();
字符串_modal_returns=“”;
void set modal_返回(字符串v){
///使用模态_返回设置器
///为实现自定义行为
///show方法的返回值
///在回调中,您可以传递对append的调用。
_模态_返回=v;
}
工厂列表(){
var e=新元素.tag('list-modal');
e、 style..backgroundColor=“橄榄色”
..位置=“绝对”
…margin=“自动”
..top=“50%”
…垂直对齐=“中间”;
var close_b=new DivElement();
关闭_b.text=“X”;
close_b.style..right=“0”
..top=“0”
…margin=“0”
..垂直对齐=“无”
…backgroundColor=“蓝色”
..位置=“绝对”;
关闭b.onClick.listen((){
e、 隐藏();
});
e、 附加(close_b,(_)=>e.hide());
e、 隐藏();
返回e;
}
@凌驾
ListModal附加(
HtmlElement e,
[函数clickHandler=null]
){
super.追加(e);
如果(clickHandler!=null){
e、 onClick.listen(clickHandler);
}否则{
e、 onClick.listen((){
this.hide();
_模态_返回=e.text;
});
}
归还这个;
}
Future show()异步{
_模态_返回=“”;
这个。隐藏=错误;
等待等待输入();
打印(模式返回);
返回模式返回;
}
等待输入()异步{
while(_modal_返回==“”&&&!this.hidden){
等待延迟();
}
}
void hide(){
hidden=true;
}
Future delay()异步{
返回新的未来(
新的持续时间(毫秒:100));
}
}
非轮询版本 为了回应甘特·泽克鲍尔的智慧(避免投票),发布了一个使用补全符的版本。一如既往地感谢你居恩特·泽克鲍尔:

import 'dart:html';
import 'dart:async';
void init(){
  document.registerElement('list-modal',ListModal);
}
class ListModal extends HtmlElement{
  ListModal.created():super.created();
  String _modal_returns="";
  Completer _completer;
  void set modal_returns(String v){
    ///use the modal_returns setter to
    ///implement a custom behaviour for
    ///the return value of the show method.
    ///Use this setter within the callback for
    ///append. Always call hide() after
    ///setting modal_returns.
    _modal_returns=v;
  }

  factory ListModal(){
    var e = new Element.tag('list-modal');
    e.style..backgroundColor="olive"
      ..position="absolute"
      ..margin="auto"
      ..top="50%"
      ..verticalAlign="middle";
    var close_b = new DivElement();
    close_b.text = "X";
    close_b.style..right="0"
      ..top="0"
      ..margin="0"
      ..verticalAlign="none"
      ..backgroundColor="blue"
      ..position="absolute";
    close_b.onClick.listen((_){
      e.hide();
    });
    e.append(close_b,(_){e.hide();});
    e.hide();
    return e;
  }
  @override
  ListModal append(
      HtmlElement e,
      [Function clickHandler=null]
      ){
    super.append(e);
    if(clickHandler!=null) {
      e.onClick.listen(clickHandler);
    }else{
      e.onClick.listen((_){
        _modal_returns = e.text;
        this.hide();
      });
    }
    return this;
  }
  Future<String> show() async{
    _modal_returns = '';
    _completer = new Completer();
    this.hidden=false;
    return _completer.future;
  }
  void hide(){
    hidden=true;
    _completer?.complete(_modal_returns);
    _completer=null;
  }
}
导入'dart:html';
导入“dart:async”;
void init(){
文件.注册表项('list-modal',ListModal);
}
类ListModal扩展了HtmleElement{
ListModal.created():super.created();
字符串_modal_returns=“”;
完成者(Completer);;
void set modal_返回(字符串v){
///使用模态_返回设置器
///为实现自定义行为
///show方法的返回值。
///在回调函数中使用此setter
///始终在
///设置模式返回。
_模态_返回=v;
}
工厂列表(){
var e=新元素.tag('list-modal');
e、 style..backgroundColor=“橄榄色”
..位置=“绝对”
…margin=“自动”
..top=“50%”
…垂直对齐=“中间”;
var close_b=new DivElement();
关闭_b.text=“X”;
close_b.style..right=“0”
..top=“0”
…margin=“0”
..垂直对齐=“无”
…backgroundColor=“蓝色”
..位置=“绝对”;
关闭b.onClick.listen((){
e、 隐藏();
});
e、 追加(close_b,(_{e.hide();});
e、 隐藏();
返回e;
}
@凌驾
ListModal附加(
HtmlElement e,
[函数clickHandler=null]
){
super.追加(e);
如果(clickHandler!=null){
e、 onClick.listen(clickHandler);
}否则{
e、 onClick.listen((){
_模态_返回=e.text;
this.hide();
});
}
归还这个;
}
Future show()异步{
_模态_返回=“”;
_完成符=新完成符();
这个。隐藏=错误;
返回_completer.future;
}
void hide(){
隐藏=真实;
_完成者?完成(模式返回);
_完成符=null;
}
}

通常,是否应该使用异步是毫无疑问的。通常人们会尽量避免这种情况。一旦你调用了一个异步API,你的代码就会变为异步的,而不可能选择你是否想要。 在某些情况下,异步执行被故意设置为异步。例如,将大型计算拆分为较小的块,以避免事件队列无法处理

在服务器端,有几个API函数允许在同步和异步版本之间进行选择。关于何时使用哪一种,进行了广泛的讨论。我将查找它并添加链接

使用
async
/
wait
而不是
的缺点应该是最小的

  • 支持
    async
    /
    wait
    的Dart SDK最低版本为1.9.1
  • 在第一次执行代码之前,VM需要进行一些额外的重写,但这通常是可以忽略的
您的代码似乎可以进行轮询

wait_for_input() async {
  while(_modal_returns=="" && !this.hidden){
    await delay();
  }
}
如果可能的话,应该避免这种情况。
最好让模态自己管理它的隐藏状态(例如,通过添加
hide()
方法),这样它就不必轮询它是否从外部隐藏了。

Hi,感谢您的评论。没有澄清这一点是我的错,但问题是一般使用'dart:async'包,而不是使用async和await关键字。特别是关于是否最好使用更少的回调和更多的异步方法来提高可读性。谢谢你的编程技巧,是的,轮询看起来确实很难看。
dart:xxx
“包”是SDK的一部分。无论代码何时执行,都要使用
dart:async
wait_for_input() async {
  while(_modal_returns=="" && !this.hidden){
    await delay();
  }
}