2015-06-26 116 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(); 
}