gpt4 book ai didi

asynchronous - 我怎样才能等待一个变量

转载 作者:IT王子 更新时间:2023-10-29 06:50:34 24 4
gpt4 key购买 nike

是否可以使用 Future等待 Dart 中一个简单变量值的变化?

在我的例子中,我有一个单例方法,在第一次调用时创建并打开一个数据库。从我的应用程序中的多个位置调用此方法,我需要一种方法让第二个、第三个等调用等到第一个调用创建并打开数据库。

class DB{
static Database _db;

static Future<Database> instance() async {
if( _db == null ){
print('Creating/opening database');
_db = await createOrOpenDatabase();
}

return _db;
}
}

// Somewhere in the app
await DB.instance().doSomething();


// Meanwhile, somewhere else in the app
await DB.instance().doSomethingElse();

这导致

Creating/opening database
Creating/opening database

解决这个问题的一种方法是添加一些变量来指示当前正在创建和/或打开数据库:

class DB{
static Database _db;
static bool _openingDb;

static Database instance() async {
if( _openingDb )
// Wait until _openingDb becomes false

if( _db == null ){
_openingDb = true;
print('Creating/opening database');
_db = await createOrOpenDatabase();
_openingDb = false;
}

return _db;
}
}

但是我该如何等待 _openingDb 的值改变呢?好像我在这里遗漏了一些明显的东西......

最佳答案

我发现我可以使用 Completer完成我想要的。

class DB {
static Database _db;
static Completer _dbOpenCompleter;

static Future<Database> instance() async {
if( _dbOpenCompleter != null && !_dbOpenCompleter.isCompleted ) {
print('Awaiting database creation');
await _dbOpenCompleter.future;
}

if( _db == null ) {
_dbOpenCompleter = Completer();
try {
print('Creating/opening database');
_db = await openOrCreateDatabase();
}
finally{
_dbOpenCompleter.complete();
}
}

return _db;
}
}

现在,与原始问题中相同的调用会产生以下输出:

Creating/opening database
Awaiting database creation

关于asynchronous - 我怎样才能等待一个变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56616173/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com