Dart:在继续之前等待回调
Dart: wait for callback before continuing
我想知道是否可以在继续流程之前等待回调。
我正在使用一个在内部处理未来的库,如果它成功,则执行回调,否则在没有回调的情况下在内部处理错误。
现在我正在尝试使用这个库创建一个实例,然后用随机测试数据填充它,然后更新那个实体。
Map generateRandomizedInstance() {
lib.createEntity((result1){
result1["a"] = generateRandomA();
result1["b"] = generateRandomB();
result1["c"] = generateRandomC();
...
lib.updateEntity(result1, (result2){
// want to return this result2
return result2;
})
});
}
如果我只创建一个实体并更新一次,这会很好,但我想创建大量随机数据:
ButtonElement b = querySelector("button.create")..onClick.listen((e){
for (int i = 0; i < 500; i++) {
generateRandomizedInstance();
}
});
这段代码很快就会崩溃,因为回调返回的速度不够快。
我尝试将方法签名更改为
generateRandomizedInstance() async {
然后做:
for (int i = 0; i < 500; i++) {
print(await generateRandomizedInstance());
}
但是 await 语法似乎无效,我不完全确定如何在某种未来包装回调代码,我可以等待回调返回,然后再继续循环的下一次迭代.
我在 generateRandomizedInstance
的末尾尝试了一个 while 循环,它等待结果变量不为 null,但这会杀死浏览器并看到我并不总是得到回调,在在某些情况下,它可能会导致无限循环。
关于如何在等待回调时暂停 for 循环的任何想法/建议?
这应该可以满足您的要求:
Future<Map> generateRandomizedInstance() {
Completer<Map> c = new Completer<Map>();
lib.createEntity((result1){
result1["a"] = generateRandomA();
result1["b"] = generateRandomB();
result1["c"] = generateRandomC();
...
lib.updateEntity(result1, (result2){
// want to return this result2
c.complete(result2);
})
});
return c.future;
}
ButtonElement b = querySelector("button.create")..onClick.listen((e) async {
for (int i = 0; i < 500; i++) {
await generateRandomizedInstance();
}
});
我想知道是否可以在继续流程之前等待回调。
我正在使用一个在内部处理未来的库,如果它成功,则执行回调,否则在没有回调的情况下在内部处理错误。
现在我正在尝试使用这个库创建一个实例,然后用随机测试数据填充它,然后更新那个实体。
Map generateRandomizedInstance() {
lib.createEntity((result1){
result1["a"] = generateRandomA();
result1["b"] = generateRandomB();
result1["c"] = generateRandomC();
...
lib.updateEntity(result1, (result2){
// want to return this result2
return result2;
})
});
}
如果我只创建一个实体并更新一次,这会很好,但我想创建大量随机数据:
ButtonElement b = querySelector("button.create")..onClick.listen((e){
for (int i = 0; i < 500; i++) {
generateRandomizedInstance();
}
});
这段代码很快就会崩溃,因为回调返回的速度不够快。
我尝试将方法签名更改为
generateRandomizedInstance() async {
然后做:
for (int i = 0; i < 500; i++) {
print(await generateRandomizedInstance());
}
但是 await 语法似乎无效,我不完全确定如何在某种未来包装回调代码,我可以等待回调返回,然后再继续循环的下一次迭代.
我在 generateRandomizedInstance
的末尾尝试了一个 while 循环,它等待结果变量不为 null,但这会杀死浏览器并看到我并不总是得到回调,在在某些情况下,它可能会导致无限循环。
关于如何在等待回调时暂停 for 循环的任何想法/建议?
这应该可以满足您的要求:
Future<Map> generateRandomizedInstance() {
Completer<Map> c = new Completer<Map>();
lib.createEntity((result1){
result1["a"] = generateRandomA();
result1["b"] = generateRandomB();
result1["c"] = generateRandomC();
...
lib.updateEntity(result1, (result2){
// want to return this result2
c.complete(result2);
})
});
return c.future;
}
ButtonElement b = querySelector("button.create")..onClick.listen((e) async {
for (int i = 0; i < 500; i++) {
await generateRandomizedInstance();
}
});