私の他の質問からの「分岐」質問として (編集 4 を参照)キャンバス getImageData を使用せずに png base64 文字列をピクセル配列に変換する方法は?
次のような一連の関数があるとどうなるのだろうか。
function convertTileToRGB(tile,whatToDoNext){
tile.img.onload = function() {
//async code returns pixels
whatToDoNext(pixels);
}
}
function doSomethingWithTile(tile,params){
convertTileToRGB(tile,function(pixels){
//manipulate pixels in tile
});
}
function doSomethingWithTile2(tile,params){
convertTileToRGB(tile,function(pixels){
//manipulate pixels in a different way
});
}
このような任意の呼び出しシーケンスの方法はありますか?
var tile = initialize_tile();
doSomethingWithTile(tile,params1)
doSomethingWithTile2(tile,params2)
doSomethingWithTile(tile,params3)
...
つまり、プログラムの実行中にディスパッチャーに非同期的に追加され、ディスパッチャーがそれらを同期的に呼び出して、何らかの方法で解決する必要がありますか?
ディスパッチャーがなく、コールバックを使用する場合、メソッドは初期化されたタイルで個別に動作しますが、それらのアクションはタイルに蓄積されません。その例では順序は保持されますが、本質的に前の async メソッドの結果は次のメソッドでは使用されません。
助けてくれてありがとう
編集: 答えてくれてありがとう。はい、順序は重要ですが、このリストは常に変更されており(さらに追加されています)、事前にはわかりません。特定の順序で行われることを非同期に追加するディスパッチャ オブジェクトを用意する方法があればいいのですが、その順序で同期的に呼び出します。ほとんどの人が混乱していたので、それに応じて質問を変更しました。
EDIT2: コードを変更しようとしています: ディスパッチャーは以下のようになります。タイルとサンプルは、呼び出しごとに異なる場合がありますが、同じ場合もあります。addSample 以外の他のアクションが適用されます。同じタイルが使用される場合、呼び出しの変更はその順序でタイルに蓄積される必要があります。そして最も重要なことは、ディスパッチャーがより多くのアクションを非同期で実行できるようにすることです。
var sample = [[0x7f,0x7f,0x7f],[0x7f,0x7f,0x7f],[0x7f,0x7f,0x7f],[0x7f,0x7f,0x7f],[0x7f,0x7f,0x7f],[0x7f,0x7f,0x7f],[0x7f,0x7f,0x7f],[0x7f,0x7f,0x7f],[0x7f,0x7f,0x7f],[0x7f,0x7f,0x7f],[0x7f,0x7f,0x7f],[0x7f,0x7f,0x7f],[0x7f,0x7f,0x7f]]
var tile = initialize_tile({width: 7,height: 7,defaultColor: [0x00,0xAA,0x00], x: 1, y: 2, zoomLevel: 1});
var dispatcher = {
0:{
func: addSample,
tile: tile,
sample: sample,
num_samples: 6,
which_sample: 1
},
1:{
func: addSample,
tile: tile,
sample: sample,
num_samples: 6,
which_sample: 2
},
2:{
func: render,
tile: tile,
}
};
var disp = dispatcher[0];
disp.func(disp.tile,disp.sample,disp.num_samples,disp.which_sample);
disp = dispatcher[1];
disp.func(disp.tile,disp.sample,disp.num_samples,disp.which_sample);
そのコードでは、順序が保持されず、タイルに何が起こったのかが次の呼び出しのために保持されません。