2017-11-08 4 views
1
for (var x = 0; x < emails.length; x++){ 
     var email = emails[x]["email"]; 
     client.single.check(email, true, true).then(
      result => { 
      if (result.getNumericResult() == 0){ 
       console.log("valid email: "+email); 
       var verified = 1; 
       admin.database().ref("https://stackoverflow.com/users/"+userID+"/emails/"+x+"/verified").set(verified, function(error){ 
       if (error) { 
        console.log("User ("+userID+") email state could not be saved" + error); 
       } 
       console.log("Saved"); 
       }); 
      } 
      }, 
      err => console.log('ERROR: ' + err.message) 
    ); 
    } 

上記は私のコードです。forループの1つの項目に対して関数を実行してから次の項目に移動するにはどうすればいいですか?

複数の電子メールアドレスを持つデータベースエントリ "emails"があります:(0) - > email:[email protected]、(1) - > email:[email protected]など

私がしようとしているのは、電子メールエントリ内の各電子メールをループし、その電子メールをチェックして検証します。しかし、検証モジュール(client.single.check)が終了する前に次の項目にループすることに気付き、その結果、データベースのパスに間違った "x"(項目)が挿入されます。それが0番目の項目にある場合は、「x」があるデータベースパスでx = 1にプッシュされます。

forループの各項目(電子メールアドレス)に対して、forループの次の項目に移動する前に電子メールのチェックを行い、結果をデータベースにプッシュするのを待つようにするにはどうすればよいですか?

このように貼り付けられています。初心者の質問に申し訳ありません!

+0

'for'ループの本体が非同期呼び出しを行うため、必要なデータを受け取る前に技術的に現在の反復処理が完了します。 Promise APIまたは[async](https://github.com/caolan/async)をご覧ください。 – djfdev

答えて

0

ここに非同期コードがあるからです。ループを再帰関数に置き換えることを検討してください:

function checkAnotherEmail() { 
    // Your code 
    result => { 
     // Success code 
     // Detection if there is a next email 
     checkAnotherEmail(); 
    } 
} 
関連する問題