同步返回一个值并在飞镖中等待
returning a value in sync and await in dart
我想了解 Dart 中 async 和 await 的用法。不知何故,我在某些方法中返回值时遇到问题。
考虑下面的代码
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()
returnsnull
。上次返回的值
好像没有看到ss = event.snapshot
这样做的正确方法是什么。
谢谢
在上面的代码中,您将匿名函数 (event){..}
声明为回调,并且您的 return
语句与之相关,而您的意图是 return
来自 getMrn()
.
您真正需要的是完成一个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.onValue
是一个 Stream
,而你只需要第一个事件,最好这样重写:
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();
}
我想了解 Dart 中 async 和 await 的用法。不知何故,我在某些方法中返回值时遇到问题。
考虑下面的代码
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()
returnsnull
。上次返回的值
ss = event.snapshot
这样做的正确方法是什么。 谢谢
在上面的代码中,您将匿名函数 (event){..}
声明为回调,并且您的 return
语句与之相关,而您的意图是 return
来自 getMrn()
.
您真正需要的是完成一个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.onValue
是一个 Stream
,而你只需要第一个事件,最好这样重写:
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();
}