同步返回一个值并在dart中等待

时间:2015-06-26 11:29:37

标签: dart

我试图理解在Dart中使用async和等待。不知怎的,我在某些方法中返回值时遇到了问题。

考虑以下代码

Future<int> getMrn() async {
  var mrnRef = await firebaseClient.child('mrn');

  DataSnapshot ss;
  StreamSubscription<Event> onValueSubscription = await mrnRef.onValue
      .listen((event) {
    ss = event.snapshot;

    return ss.val();
  });

  //return Future<int> ss.val();
}

mrn属于int类型,应由getMrn方法返回。但是每次返回的ss.val()都会返回null。似乎在最后返回的值中看不到ss = event.snapshot

这样做的正确方法是什么。 感谢

1 个答案:

答案 0 :(得分:5)

在上面的代码中,您将匿名函数(event){..}声明为回调,并且您的return语句与之相关,而您的意图是return来自{getMrn() 1}}。

您实际需要的是完成 Future您在回调中从getMrn()返回。{/ p>

像这样:

Future<int> getMrn() async {
  var mrnRef = await firebaseClient.child('mrn');

  Completer<int> c = new Completer<int>();
  StreamSubscription<Event> onValueSubscription = await mrnRef.onValue
      .listen((event) {
    DataSnapshot ss = event.snapshot;
    c.complete(ss.val());
  });

  return c.future;
}

但如果mrnRef.onValue流中出现第二个事件,那么该代码将无法正常工作。因此,假设mrnRef.onValueStream,并且您只需要第一个事件,那么最好以这种方式重写它:

Future<int> getMrn() async {
  var mrnRef = await firebaseClient.child('mrn');

  Event event = await mrnRef.onValue.first;
  DataSnapshot ss = event.snapshot;
  // note, you're implicitly returning a Future<int> here,
  // because our function is asyncronous
  return ss.val();
}