2016-08-05 5 views
0

Problem resolved on this Topic

の関数で生成された配列を取得し、箱の外に渡し私はaccountNumbers[]結果を得るが、if (success) {文の配列に成功したが作成され、accountNumbers配列の中に押し込まsocket.emit('syncContacts', accountNumbers)で、クライアント内は非同期iは<code>checkUserMobileNumberAsEwallet</code>関数にjsonArrayなどの単純なアレイを生成することができるが、私はそれからそれを通過できない(解決された)コード下これに

を送信

socket.on('syncContacts', function (data) { 
    var accountNumbers = []; 

    for (var i = 0; i < data.length; i++) { 
     checkUserMobileNumberAsEwallet(data[i].mobileNumber, function (success) { 
      if (success) { 
       accountNumbers.push({ewalletNumber: this.mobileNumber}); 
       console.log(accountNumbers); 
      } 
     }.bind({mobileNumber: data[i].mobileNumber})); 
    } 
    console.log(accountNumbers); 

    socket.emit('syncContacts', accountNumbers); 
}); 

function checkUserMobileNumberAsEwallet(mobileNumber, callback) { 
    var mobileNumber = mobileNumber.substr(1, mobileNumber.length); 

    var query = "SELECT id FROM userEwallets WHERE ewalletNumber LIKE '%" + mobileNumber + "'"; 
    connection.query(query, function (err, results) { 
     if (err) return callback(false); 

     if (results.length === 0) 
      return callback(false); 
     else { 
      return callback(true); 
     } 

    }); 
} 

はポストのコメントの後に更新:checkUserMobileNumberAsEwalletは、関数コールバックを受け入れる非同期イベント、であるように私たちのコードに基づいて

socket.on('syncContacts', function (data) { 

    //console.log(accountNumbers); 

    //socket.emit('syncContacts', accountNumbers); 

    async.parallel(
     [ 
      function (callback) { 
       var accountNumbers = []; 

       for (var i = 0; i < data.length; i++) { 
        checkUserMobileNumberAsEwallet(data[i].mobileNumber, function (success) { 
         if (success) { 
          accountNumbers.push({ewalletNumber: this.mobileNumber}); 
          console.log(accountNumbers); 
         } 
        }.bind({mobileNumber: data[i].mobileNumber})); 
       } 
       callback(success, accountNumbers); 
      } 
     ], 
     function (success, results) { 
      console.log("results " + results.toString()); 
      socket.emit('syncContacts', results); 
     }); 
}); 

function checkUserMobileNumberAsEwallet(mobileNumber, callback) { 
    var mobileNumber = mobileNumber.substr(1, mobileNumber.length); 

    var query = "SELECT id FROM userEwallets WHERE ewalletNumber LIKE '%" + mobileNumber + "'"; 
    connection.query(query, function (err, results) { 
     if (err) return callback(false); 

     if (results.length === 0) 
      return callback(false); 
     else { 
      return callback(true); 
     } 
    }); 
} 
+0

私はあなたが使用しているものソケットライブラリわからないんだけど、しかし '.emit'で送られたデータは文字列でなければならないのでしょうか? – Whothehellisthat

+0

@JoseRojasいいえ、私は何もエラーが発生しません、コードはうまく動作しますが、配列に項目をプッシュすると、機能が無効になります。 –

+0

@Whothehellisthatの問題は配列の内容で、送信するにはnullが返されます –

答えて

0

、それはそうです。これは、forループが実行され、実行をcheckUserMobileNumberAsEwalletにキューイングすることを意味します。 forループが実行された直後に、console.logは空の配列accountNumbersを正しく出力し、ソケットを通してイベントを送出します。次に、各checkUserMobileNumberAsEwalletの実行にコールバック関数が実行され、データがあるaccountNumbers配列をログに記録します。

これはいくつかの方法で解決できますが、最も簡単で最も読みやすいのは、約束を作成し、約束した時点で約束することです。個人的に私はいつの約束のライブラリが好きですが、多くの図書館がこの問題を解決するのに役立ちます。 https://github.com/cujojs/when/blob/master/docs/api.md#whensettle

+0

@Michael Camdenは 'if'文に' '{{ewalletNumber: '7892331743'}}'を返し、 'for'のように終了したら' [] ' –

+0

@Michael Camden私の投稿が更新されました。ありがとう –

0

問題は、コールバック内のコードが実行されるときを制御することはできませんということであり、それはあなたがすでにsocket.emit呼ばれてきました後を実行してしまいます。

非同期アグリゲータを使用して、成功したモバイル番号ごとにコールバックを呼び出し、それらのすべてが終了したら、socket.emitコールを呼び出すか、b)以下のようにします。

には、次の試し受け入れ、携帯電話番号の配列を確認し、自分のコールバック関数に成功した番号を渡すためにあなたのcheckUserMobileNumberAsEwallet機能を変更:

socket.on('syncContacts', function (data) { 
    var accountNumbers = []; 
    var mobileNumbers = []; 

    for (var i = 0; i < data.length; i++) { 
    mobileNumbers.push(data[i].mobileNumber); 
    } 

    checkUserMobileNumberAsEwallet(mobileNumbers, function (successfulNumbers) { 
     if (successfulNumbers.length > 0) { 
      for (var i = 0; i < successfulNumbers.length; i++) { 
       accountNumbers.push({ewalletNumber: successfulNumbers[i]}); 
      } 
      socket.emit('syncContacts', accountNumbers); 
     } 
    }.bind({mobileNumbers: mobileNumbers})); 
}); 
+0

私は作成された配列を送信したい投稿するすべてのforループステートメント –

+0

私のポスト更新 –

+0

あなたの更新が表示されます。 async.parallelの仕組みがわからない。それはsocket.emitで単一のコールバックが後に続くコールバックの配列を呼び出すでしょうか?もしそうなら、それはあなたが望むように聞こえる。 – dshapiro

関連する問題

 関連する問題