0

私が質問したことを表す用語があるかどうかわからないので、説明してみます。

連絡先の配列を取得し、それらをループして Web サイトでのステータスを更新する関数を取得しました。「something.getStatus」関数は何も返しませんが、正常に完了すると、ユーザーのステータス (オンライン/オフライン/など) が返されます。

ここでの問題は、内部の関数が呼び出されたときに、変数 user_id がすべての関数呼び出しの配列の最後の変数であり、どのようなステータスを持っているかを知ることが不可能になることです。

function gotGroupContacts(contacts) {

 for ( i = 0; i < contacts.length; i++) {
  var user_id = contacts[i];
  something.getStatus(user_id, function(resp) {
   updateLinkStatus(user_id, resp.status, resp.statusMessage);
  }, getStatusErrorHandler);
 }
}

変数を「ロック」する方法、または変数を内部の関数に渡す方法はありますか?

4

2 に答える 2

1

getStatusメソッド呼び出しをクロージャーで囲みます。

for ( i = 0; i < contacts.length; i++) {
  var user_id = contacts[i];
  (function(uid) {
     something.getStatus(uid, function(resp) {
        updateLinkStatus(uid, resp.status, resp.statusMessage);
     }, getStatusErrorHandler);
  }(user_id))
}

user_id匿名の自己実行関数に渡され、これにより正しい値が確保されます

于 2012-08-09T11:23:13.040 に答える
0

スクリプトが IE <9 と互換性を持つ必要がない場合は、次のように記述できます。

function gotGroupContacts(contacts) {
  contacts.forEach(function(user_id){
     something.getStatus(user_id, function(resp) {
        updateLinkStatus(user_id, resp.status, resp.statusMessage);
     }, getStatusErrorHandler);
  });
}

注意: forEach メソッドは IE に簡単に移植できます。これを参照してください: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/forEach

于 2012-08-14T09:24:53.243 に答える