【发布时间】:2014-07-10 14:02:18
【问题描述】:
我正在尝试创建一个执行各种与数据相关的任务的服务器端 Dart 类。所有这些任务都依赖于首先初始化的数据库。问题是数据库的初始化是异步发生的(返回一个未来)。我首先尝试将初始化代码放入构造函数中,但由于它似乎不可行而放弃了这种方法。
我现在正试图弄清楚如何将数据库初始化作为任何访问数据的方法调用的第一步。所以换句话说,当在下面调用尝试登录()时,我想首先检查数据库是否已初始化,并在必要时对其进行初始化。
但是,有两个障碍。如果数据库还没有初始化,代码很简单——初始化数据库,然后使用返回的 future 的 then() 方法来完成剩下的功能。如果数据库尚未初始化,我将 then() 方法附加到什么?
第二个相关问题是当数据库当前正在初始化但此过程尚未完成时会发生什么?我如何才能拉入并返回这个“进行中”的未来?
这是我试图解决的代码的基本要点:
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
});
}
}
提前感谢您的帮助,
格雷格
【问题讨论】:
-
我会发现在任何与数据库相关的代码可以运行之前而不是在每个数据库操作之前确保数据库初始化更容易。你这样做有理由吗?
-
@Günter 我最初尝试在类构造函数中进行数据库初始化,但在测试时遇到了问题。我在 StackOverflow 上发布了一个关于它的问题:stackoverflow.com/questions/24592070/…,但没有得到关于如何解决问题的好的答案。
-
我为您的其他问题添加了答案。我还没有测试过它,但至少它应该可以帮助你理解这个想法。
标签: dart dart-async