2

ブラウザー側のインデックス付き DB からオブジェクトを削除する関数を dart で作成していたときに、内部関数内から外部関数値を返す必要があることに気付きました。

Future<bool> delete() {
    Transaction tx = db.transactionStore(storeName, "readwrite");
    ObjectStore os = tx.objectStore(storeName);
    os.delete(_key); // returns blank future, modifies tx

    // This is not correct, but shows the idea:
    if (tx.onComplete) {return true;}
    if (tx.onError) {return false;}
}

この関数は、インデックス付き DB への保存と読み込みに使用しているクラスのメソッドです。true削除操作が成功または失敗したときに、この関数がor false、または同じものを含む Future オブジェクトを返すようにします。ただし、ボトルネックはos.delete(_key);ステートメントです。future を返しますが、削除操作の実際の成功または失敗は and によって提供されtx.onCompleteますtx.onError。これらのオブジェクトは両方ともストリームであるため、それらからのイベントを処理する無名関数を作成する必要があります。

tx.onComplete.listen((e){
    return_to_outer_function(true);
});
tx.onError.listen((e){
    return_to_outer_function(false);
});
return_to_outer_function(bool) {
    return bool; // doesn't work
}

ご覧のとおり、無名関数を作成すると、return ステートメントはメソッドを完成させるのではなく、内部関数を完成させます。内部関数に他の関数を呼び出させることもできますが、それらの他の関数には、メソッド全体に結果を返さない独自の return ステートメントがあります。

一時変数を設定して定期的にチェックする方法を試してみましたが、バグの可能性があるだけでなく、シングル スレッドのイベント ループが占有されるため、使用したくない非常に洗練されていないソリューションです。

内部関数から外部関数に値を返すことは可能ですか? または、一連のストリームからのイベントの有無から値を取得するための他のより良い方法はありますか? または、この問題を回避する IndexedDB の別の使用方法はありますか?

4

1 に答える 1