2015-06-26 88 views
2

我想了解飞镖中异步和等待的用法。不知怎的,我有问题返回某些方法的值。同步返回值并等待飞镖

考虑下面

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在上次返回的值中看不到

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

回答

5

在上面的代码,你正在声明匿名函数(event){..}作为回调,和你的return声明涉及到它,而你打算从getMrn()return

你实际需要什么,是完成 a Future你从getMrn()返回你的回调。

像这样:

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