私はあなたが何をしているのか知っています。残念ながら私は良い解決策を見たことがありません。基本的に非同期コードはこのようになります。
一つの解決法アルゴリズム:
static var resourcesNeededAreLoaded:Boolean = false;
static var shouldDoItOnLoad:Boolean = false;
function doSomething()
{
if(resourcesNeededAreLoaded)
{
actuallyDoIt();
}
else
{
shouldDoItOnLoad = true;
loadNeededResource();
}
}
function loadNeededResource()
{
startLoadOfResource(callBackWhenResourceLoaded);
}
function callBackWhenResourceLoaded()
{
resourcesNeededAreLoaded = true;
if(shouldDoItOnLoad)
{
doSomething();
}
}
パターンのこの種のは、あなたが遅延読み込みを行うことができますが、必要なときに、あなたはまた、負荷を強制することができます。この一般的なパターンは抽象化することができ、うまくいく傾向があります。注:重要な部分は、ロードコールバックからdoSomething()
を呼び出していて、コードが同期外れにならないようにするためには、actuallyDoIt()
ではありません。
上記のパターンをどのように抽象化するかは、使用例によって異なります。すべてのリソースのロードと取得を管理する単一のクラスを持つことができ、ロードされているものとされていないものを管理するためにマップを使用し、リソースが利用できない場合に呼び出し元がコールバックを設定できるようにします。例えば
public class ResourceManager
{
private var isResourceLoaded:Object = {};
private var callbackOnLoad:Object = {};
private var resources:Object = {};
public function getResource(resourceId:String, callBack:Function):void
{
if(isResourceLoaded[resourceId])
{
callback(resources[resourceId]);
}
else
{
callbackOnLoad[resourceId] = callBack;
loadResource(resourceId);
}
}
// ... snip the rest since you can work it out ...
}
私はおそらくイベントを使用し、コールバックは使用しませんが、それはあなた次第です。場合によっては、アルゴリズムを管理できるオブジェクトにローディング・プロキシーを渡すことが必要な場合がある、すべてのリソースを管理するセントラル・クラスは不可能です。
public class NeedsToLoad
{
public var asyncLoader:AsyncLoaderClass;
public function doSomething():void
{
asyncLoader.execute(resourceId, actuallyDoIt);
}
public function actuallyDoIt():void { }
}
public class AsyncLoaderClass
{
/* vars like original algorithm */
public function execute(resourceId:String, callback:Function):void
{
if(isResourceLoaded)
{
callback();
}
else
{
loadResource(resourceId);
}
}
/* implements the rest of the original algorithm */
}
ここでも、イベントへのコールバックでの作業から上記を変更することは難しいことではありません(私は実際に好むだろうが、そのための短いサンプルコードを書くことが困難です)。
上記の2つの抽象のアプローチは、単にオリジナルのアルゴリズムをカプセル化する方法を確認することが重要です。そうすれば、ニーズに合ったアプローチを調整できます。リソースの状態を知っている
- ...呼び出し側のコンテキストまたはサービスの抽象化:最終的な抽象化で
主な決定要因はに依存しますか?
- あなたはリソースを獲得するために中心的な場所を必要とします...そして、この中心的な場所をあなたのプログラム全体で利用できるようにするのは面倒です(シングルトン)
- プログラムの読み込みの必要性は本当に複雑ですか? (例えば、リソースのリストが利用可能になるまで機能が実行されないように、この抽象化を書くことが可能である)。私のプロジェクトの一つで