2017-06-29 15 views
0

私の配列が完了するが、インデックスが存在しないFirebaseオブジェクト

ミDB:コンソールで

v_tableM='ad_modulo'; 
v_tableI='ad_permiso'; 
v_tableF='ad_persona'; 

const v_db=firebase.database().ref(); 
const v_child1=v_db.child('/'+v_tableM+'/'); 
const v_child2=v_db.child('/'+v_tableI+'/'); 
const v_child3=v_db.child('/'+v_tableF+'/'); 



v_child1.on('child_added', v_child1Snap=>{ 
    const v_child1Key=v_child1Snap.key; 

    v_child2.child(v_child1Key).once('value', v_child2Snap=>{ 
    if (v_child2Snap.val() != null){ 
     v_child2SnapVal=v_child2Snap.val(); 
     const v_child2Key=v_child2Snap.key; 
     if (v_child1Key==v_child2Key) { 
     Object.keys(v_child2SnapVal).forEach(function (v_key) { 
      v_child3.child(v_key).once('value', v_child3Snap=>{ 
      v_detail=[v_child2Key,v_key,v_child1Snap.val(),v_child3Snap.val()]; 
      v_result.push(v_detail); 
      }); 
     }); 
     } 
    } 
    }); 

}); 

console.log(v_result); 

結果:配列コンソールで

[] 

クリック:

[] 
0: Array(4) 
1: Array(4) 
2: Array(4) 
3: Array(4) 
4: Array(4) 
length: 5 
__proto__: Array(0) 

Mi DB Json:

DB JSON

答えて

0

あなたの変数を印刷する前に完了するために、非同期機能を許可していません。 thisを読んでください。私は非同期関数を呼び出し、配列を出力します。例えば、

var example_array = []; 
exampleAsyncCall(example_array) 
.then(function(example_array) { 
    console.log(example_array); 
}); 

そして、その後、あなたの例の関数の中で、私は、モバイル上でこれをやっている、汚いコードについて申し訳ありません

function exampleAsyncCall(v_result) { 
return new promise((resolve, reject) { 
    v_tableM = 'ad_modulo'; 
    v_tableI = 'ad_permiso';   
    v_tableF = 'ad_persona'; 
      const v_db = firebase.database().ref(); 
      const v_child1 = v_db.child('/' + v_tableM + '/'); 
      const v_child2 = v_db.child('/' + v_tableI + '/'); 
      const v_child3 = v_db.child('/' + v_tableF + '/'); 
      v_child1.on('child_added', v_child1Snap => { 
       const v_child1Key = v_child1Snap.key; 
       v_child2.child(v_child1Key).once('value', v_child2Snap => { 
        if (v_child2Snap.val() != null { 
          v_child2SnapVal = v_child2Snap.val(); 
          const v_child2Key = v_child2Snap.key; 
          if (v_child1Key == v_child2Key { 
            Object.keys(v_child2SnapVal).forEach(function(v_key) { 
             v_child3.child(v_key).once('value', v_child3Snap => { 
              v_detail = [v_child2Key, v_key, v_child1Snap.val(), v_child3Snap.val()]; 
              v_result.push(v_detail); 
             }); 
            }); 
      resolve(v_result); 
      //Resolve here, after the forEach loop has completed. 
           } 
          } 
         }); 
       }); 
      }); 
     } 

を言うことができます。

+0

ありがとうございました。コードを変更してください。今はコンソールに何も印刷しません。 – roblink

+0

あなたが持っているものがあなたの答えにあるなら、あなたはforEachループの後に 'resolve;'を追加するのを忘れました。上記のコードをもう一度コピーしてください。 @ user3621571 –

0

私はコードを変更しましたが、今はコンソールで何も私に持って来ません。

var example_array = []; 
exampleAsyncCall(example_array).then(function(example_array) { 
    console.log(example_array); 
}); 

function exampleAsyncCall(v_result) { 
    return new Promise((resolve, reject) => { 
    v_tableM='ad_modulo'; 
    v_tableI='ad_permiso'; 
    v_tableF='ad_persona'; 

    const v_db=firebase.database().ref(); 
    const v_child1=v_db.child('/'+v_tableM+'/'); 
    const v_child2=v_db.child('/'+v_tableI+'/'); 
    const v_child3=v_db.child('/'+v_tableF+'/'); 

    v_child1.on('child_added', function(v_child1Snap){ 

     const v_child1Key=v_child1Snap.key; 
     const v_module = v_child1Snap.val(); 
     v_child2.child(v_child1Key).once('value', function(v_child2Snap){ 
     if (v_child2Snap.val() != null){ 
      const v_child2SnapVal=v_child2Snap.val(); 
      const v_child2Key=v_child2Snap.key; 
      if (v_child1Key==v_child2Key) { 
      v_child3.orderByKey().on('child_added', function(v_child3Snap){ 
       const v_child3Key=v_child3Snap.key; 
       v_result.push(v_child1Key,v_child3Key,v_child1Snap.val(),v_child3Snap.val()); 
      }); 
      } 
     } 
     }); 
    }); 
    }); 
} 
+0

私のコードを私の答えに完全にコピーしてください。あなたは 'resolve;'ステートメントを必要としません。 –

関連する問題