我试图创建一个服务器端的Dart类,它执行各种与数据相关的任务。所有这些任务都依赖于数据库的初始化。问题是数据库的初始化是异步发生的(返回一个Future)。我首先尝试将init代码放入构造函数中,但已经放弃了这种方法,因为它似乎不可行。
我现在试图弄清楚如何在任何访问数据的方法调用中强制DB初始化作为第一步。换句话说,当下面调用attemptLogin()时,我想首先检查DB是否已经初始化,并在必要时初始化它。
然而,有两个障碍。如果数据库还没有初始化,代码很简单-初始化数据库,然后使用返回的future的then()方法来执行剩下的函数。如果数据库还没有初始化,我应该把then()方法附加到什么?
第二个相关的问题是,当数据库正在初始化,但这个过程还没有完成时,会发生什么?我如何拉入并返回这个“正在进行中”的Future?
这是我试图讨论的代码的基本要点:
class DataManager {
bool DbIsReady = false;
bool InitializingDb = false;
Db _db;
Future InitMongoDB() {
print("Initializing MongoDB");
InitializingDb = true;
_db = new Db("mongodb://127.0.0.1/test");
return _db.open().then((_) {
DbIsReady = true;
InitializingDb = false;
});
}
Future<List> attemptLogin(String username, String password) {
Future firstStep;
if ((!DbIsReady) && (!InitializingDb) {
Future firstStep = InitMongoDB()
}
else if (InitializingDb) {
// Need to return the InitMongoDB() Future that's currently running, but how?
}
else {
// How do I create a blank firstStep here?
}
return firstStep.then((_) {
users = _db.collection("users");
return // ... rest of code cut out for clarity
});
}
}
先谢谢你的帮助,
格雷格
6条答案
按热度按时间wvyml7n51#
刚回来
gajydyqb2#
让未来继续活着:
您可能需要注意错误情况。如果您想处理
initMongoDB
中或之后的错误,则由您决定。jyztefdp3#
可能的解决方案之一:
输出:
我认为存在更好的解决方案,但这只是试图回答你的问题(如果我正确理解你)。
P.S.编辑于2014年7月11日
稍微修改了一下(带错误处理)示例。
dsekswqp4#
对于那些仍然想知道如何在Dart中创建一个空白的
Future
并在以后完成它们的人,你应该像下面的例子一样使用Completer
类。j91ykkif5#
Future在Dart中是不可空的,这意味着你必须将它初始化为一个值。如果你不这样做,Dart会抛出以下错误:
错误:应初始化字段,因为其类型“Future”不允许为null。
要初始化Future,请参见以下示例:
这里的“Future String”是一个String,因此上面的代码返回Future的一个示例。
因此,在谈到如何创建一个空白/空的Future的问题时,我使用了以下代码来初始化一个空的Future列表。
我发现这个链接对于理解Flutter和Dart中的Futures非常有用:https://meysam-mahfouzi.medium.com/understanding-future-in-dart-3c3eea5a22fb
k2arahey6#
要创建
void
类型的黑色Future,例如:这里,一个类型为
Future<void>
的空函数被分配给onRefresh
属性。