我有一个如下程序:
main() async {
ooClass = new OoClass(1);
int val = await function1();
print(val);
ooClass = new OoClass(2);
val = await function1();
print(val);
ooClass = new OoClass(3);
val = await function1();
print(val);
}
OoClass ooClass;
Future<int> function1() async {
List list3 = await function2();
return list3.indexOf('Ok');
}
Future<List<String>> function2() async {
List<String> list1 = new List<String>();
function3(Map<String, int> map1) async {
String string1 = '';
bool bool1 = false;
List<String> list2 = [];
String string2;
function4(String string3) async {
if …Run Code Online (Sandbox Code Playgroud) 我真的很喜欢Dart中的async/await模式.它允许我编写可读的方法.
但是,有一些问题是有问题的,尤其是一些,我根本不知道管理的热情.
问题是在方法中使用异步和多个等待,我们在方法中引入了并发性.例如,如果我有一个方法:
Future<int> foo(int value) async {
await foo2();
await foo3();
await foo4();
int ret = foo5(value);
return ret;
}
Run Code Online (Sandbox Code Playgroud)
嗯,这是一个非常简单的例子.这里的问题是,对于每个await,该方法都放在事件循环中.没关系,当你理解它时,但这并不妨碍你的应用程序再次调用方法,因为它已经重新调整了一个值.
考虑该方法是否正在管理类的实例所共有的数据,而不是方法本身.
所以,我尝试了以下解决方案:
bool isWorking = false;
Future<int> foo(int value) async {
if (isWorking) return foo(value);
isWorking = true;
await foo2();
await foo3();
await foo4();
int ret = foo5(value);
isWorking = False;
return ret;
}
Run Code Online (Sandbox Code Playgroud)
据我所知,调用future方法会立即将它放在事件循环中,所以我认为方法的并发调用的执行被推迟到第一个结束时.但事实并非如此,程序进入无限循环.
任何人都可以给我一个解释和解决这个问题的方法吗?
编辑:一般来说,我认为与其他语言一样,有一个synchronized关键字,意思是该方法,如果第二次调用将等到第一次结束,这可能会很有趣.就像是:
Future<int> foo(int value) async synchronized {
Run Code Online (Sandbox Code Playgroud)
编辑2:
我真的很兴奋,因为我觉得我已经解决了这个问题,我已经有很长一段时间了.感谢Argenti,尤其是Alexandre给我的解决方案.我只是简单地重新构建了解决方案以便于重用(至少对我而言)并在此处将其发布在我创建的类中以及如何将其用于可能需要它的人的示例(尝试自担风险;-)).我使用了mixin,因为我发现它很实用,但如果你愿意,可以单独使用Locker类.
myClass extends Object with LockManager {
Locker locker = LockManager.getLocker();
Future<int> foo(int value) …Run Code Online (Sandbox Code Playgroud) 我正在使用 dart 开发一个 angular 2 项目。我看到了一些用 typescript 编写的有趣的组件库,我想在我的应用程序中使用它们。是否可以?如果是,如何?我用谷歌搜索了很多,但我找不到任何提示......
如果我尝试将一个带有泛型的类型赋给Type变量,我会得到一个错误,但如果我使用一个runtimeType变量,一切正常.
Type t = List;
//Type t1 = List<int>; // ERROR !!!
Type t2 = new List<int>().runtimeType;
print('$t $t2'); //> List List<int>
Run Code Online (Sandbox Code Playgroud)
这是一个bug还是有些东西我没有得到?
我在尝试检查 Dart 中某些对象的运行时类型时发现了一些奇怪的行为。我们举一个简单的例子:
main(List<String> args) {
List<Map> l1 = new List<Map>();
l1.add(new Map<String, int>());
List<int> l2 = ['Start', 'Stop'];
checkType(l1.runtimeType);
checkType(l1[0].runtimeType);
checkType(l2.runtimeType);
}
checkType(Type type) {
switch(type) {
case List:
print('it is a List!');
break;
case Map:
print('it is a List!');
break;
default:
print('Unmanaged type $type');
break;
}
}
Run Code Online (Sandbox Code Playgroud)
这个程序有以下输出:
非托管类型List<Map>
非托管类型_InternalLinkedHashMap<String, int>
非托管类型List
第一种情况无法在 switch 语句中检查,因为如果我尝试设置“ List<Map>”情况,我会收到错误:在常量表达式中,此运算符的操作数必须是“num”类型第二个无法匹配,因为使用case 中的 _InternalLinkedHashMap 得到以下错误:Case expression must be constant。
在最后一种情况下,我将 List 定义为一个整数列表 ( List<int>),但系统忽略了它并将其视为一个简单的 List。我认为这是一种误导,应该禁止这样的声明。
任何帮助/建议?
飞镖:1.24.2; 角度:4.0.0; 我创建了一些基于角形式的CSS规则.ng-valid和.ng-invalid类.但是,在最后一个版本中,似乎ng-valid并ng-invalid没有暴露类,所以我的CSS规则不再有用.这是对的吗?如果是的话,我怎么能绕过这个改变?
编辑1:测试用例我只是在IDE(WebStorm)中使用角度和角度材质生成了一个全新的项目.它生成一个简单的待办事项应用程序.我拿了todo_list_component.html并用<form> </form>标签包装了整个内容.在todo_list_component.dart中,我为angular_forms添加了一个导入,并将formDirectives添加到指令列表中.在dartium中检查表单没有ng-valid添加任何类.在我的例子中,唯一添加的类是:class="_ngcontent-umj-2"
Edit2:快捷方式不是很优雅,但工作:
<form #form="ngForm" [class.ng-valid]="form.valid" [class.ng-invalid]="!form.valid">
Run Code Online (Sandbox Code Playgroud) dart 1.24.3,Angular 4.0.0
出于可重复使用的原因,我将我的应用程序分成了许多包.假设我使用的是包C,这取决于依赖于包A的包B.在其他包中也使用A,B可以单独使用.最后,C向B添加了更多信息,并以某种方式定制.
现在,在包中AI有一个显示一些信息的模态窗口,但在包中BI应该添加一个组件,在包C中再添加一个.由于这个模态窗口在我的所有组件表单中使用,我无法在子包内自定义它,因为这意味着继承所有父表单并自定义它们.我想要使用的是类似于提供者注入(例如我想在我的应用程序组件C中声明的内容):
ModalWindowComponent,
const Provider(pack_b.ModalWindowComponent, useClass: ModalWindowComponent),
const Provider(pack_a.ModalWindowComponent, useClass: ModalWindowComponent)
Run Code Online (Sandbox Code Playgroud)
谷歌搜索我看到了一些我可以在我的案例中使用的东西,即ComponentResolver类.但是,如果它是Angular 5的新功能或者也可以在角度4中使用,我无法得到.在其他一些地方它似乎也会被弃用,所以我有点困惑.此外,我不需要在DOM中动态添加组件,而是动态地将组件替换为子包中的组件(继承基础组件).
有没有办法做到这一点?有什么例子我可以看看吗?
dart ×7
angular ×3
angular-dart ×2
async-await ×2
types ×2
css3 ×1
for-loop ×1
forms ×1
generics ×1
typescript ×1