更新2: これはより良い説明だと思います:
2つのコールバックがあり、それぞれが配列を埋めています。どういうわけかこれらの配列をマージしたいと思います。これを行うための単純な方法は、配列がいっぱいになるまで待ってから、forループでマージすることです。コールバックが「完了」したかどうかを確認する実際の方法がないため、これを行うことはできません。
次のステップは次のようになります。オブジェクトがコールバックによってダウンロードされるたびに、マージ配列(混合と呼ばれる)をチェックし、「パートナー」オブジェクトが含まれているかどうかを確認します。含まれている場合:次に、そのパートナーオブジェクトにマージします。そうでない場合は、そのオブジェクトを挿入します。
競合状態が心配です。コールバック1は配列が空であることを確認し、配列に挿入することを決定しますが、コントロールは最初に挿入するコールバック2に切り替わります。コールバック1は挿入ではなくマージする必要がありますが、コントロールが元に戻ると、代わりに挿入されます。
コードのアトミックな「チェックと挿入/マージ」ブロックを作成できれば、役立つ可能性があります。それを行う方法はありますか?
アップデート1: コードとさらに多くの単語が追加されました!
みなさん、お返事ありがとうございます。私は行って、コードをできるだけ単純化しようとしました。
言葉:
混合という配列があります。混合は、最終的に次のようになります。タイプ(A)のすべてのオブジェクト、およびタイプ(B)のアナログオブジェクト(「プライベート」とも呼ばれます)がある場合は、それらをマージする必要があります。
これは、コールバックを使用する2つの関数getAllAとgetAllBを使用することを意味します。今、私は両方を呼び出し、少し手動で待ってから、そのマージを行うforループを実行します。
私がする必要があるのは、コールバックでマージが行われるようにコードを編集することです。ただし、競合状態を作成しない方法でマージする方法は考えられません。
素朴に、私は最初にタイプAのオブジェクトと混合して埋め、次にBオブジェクトを反復処理し、必要に応じてそれらをマージしたいと思うかもしれません。ただし、Firebaseでon( "contact_added")を使用して「完了」したかどうかを確認する方法がないため、これを行うことはできません。並行配列構造が欲しいと思いますが、組み込みの配列の使い方がわかりません。自分で作ったのかどうかを確認する方法がわからないので、自分で作るのが心配です。競合状態はそのように注意が必要です。
ここで、コード: 参照する必要のあるスクリプトは次のとおりです。
そして、これが私がjavascriptコンソールに貼り付けるものです:
//Note: private ~~ B
// public ~ A
var me = 'IWwypRHWpDmydd30o-v';
var mixed = new Array();
var mixedNames = new Array();
var privates = new Object();
var callbackB = function(snapshot){
child = snapshot.val();
privates[snapshot.name()] = child;
};
var callbackA = function(snapshot){
var listRef = snapshot.ref();
listRef.on('child_added', function (snapshot2) {
child = snapshot2.val();
mixedNames.push(snapshot2.name());
mixed.push(child);
});
};
var getAllB = function (callback, ownerid){
var priv = new Firebase('http://gamma.firebase.com/innermost/project/private/' + ownerid);
priv.on('child_added', function (snapshot){
callback(snapshot);
});
};
function getAllA(callback) {
var pub = new Firebase('http://gamma.firebase.com/innermost/project/public');
pub.once('value', function (snapshot) {
if (snapshot.val() === null) {
alert('snapshot does not exist.');
}
callback(snapshot);
});
}
getAllA(callbackA);
getAllB(callbackB, me);
//////wait
for (b in privates){
var index = $.inArray(b, mixedNames);
if (index < 0){ //if there is no record with this name
mixed.push(privates[b]);
mixedNames.push(b);
}
else{
var pub = mixed[index];
var mutt = returnMixed(pub, privates[b]);
mixed.splice(index,1,mutt);
}
};
私がやりたいのは、ロジックをforループからコールバックに移動することです。forループをすぐに実行すると、配列はまだコールバックを介してダウンロードされないためです。
古いエントリ:
Firebaseのデータリストにアクセスする2つのコールバックがあります。
コールバック1はタイプAのオブジェクトを取得します。コールバック2はタイプBのオブジェクトを取得します。
私の目標は、タイプAとタイプBのオブジェクトを適切にマージする配列を用意することです。
タイプBのほとんどの(ただし必然的にすべての)オブジェクトには、タイプAの「パートナー」オブジェクトがあります。タイプAのいくつかのオブジェクトには、タイプBのパートナーオブジェクトがあります。
Firebaseから取得したオブジェクトごとに、パートナーが配列に含まれているかどうかを確認したいと思います。そうでない場合は、挿入します。その場合は、代わりにパートナーと「マージ」します。
同時データ構造なしでこれを行う方法を考えることはできませんが、Javascriptでそれを行う方法がわかりません。
どうすればその並行配列を作成できますか、または他の方法で目標を達成する方法を見つけることができますか?