Dart:在继续

时间:2015-09-24 12:30:37

标签: callback dart dart-html dart-async

我想知道是否可以在继续进程之前等待回调。

我正在使用一个在内部处理未来的库,然后如果它成功,则执行回调,否则在内部处理错误而不进行回调。

现在我正在尝试使用此库创建一个实例,然后用随机测试数据填充它,然后更新该实体。

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());
}

但等待语法似乎无效,我不完全确定如何在某种未来包装该回调代码,我可以等待回调返回,然后再继续循环的下一次迭代。 / p>

我在generateRandomizedInstance的末尾尝试了一个等待结果变量不为空的while循环,但这会杀死浏览器,因为我并不总是得到一个回调,在某些情况下它可能会导致无限循环。

有关如何在等待回调时暂停for循环的任何想法/建议?

1 个答案:

答案 0 :(得分:2)

这应该做你想要的:

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();
    }
});