0

関数内に追加し、関数の実行後に呼び出すjavascript配列があります(db情報はCouchDBの呼び出しです)。

$(document).ready(function() {

  my_array = [];

  view_name = db_name+'/farms_by_name'
  $db.view(view_name, {
    success: function(data) {
       console.log(data)
       for (i in data.rows) {
           console.log(data.rows[i]);
           plot_name.push(data.rows[i].value.name);
           my_array.push("0");
           console.log(my_array)
           console.log(my_array.length)
        }
    },
    error: function(e) {
      alert('Error loading from database: ' + e);
    }
  });

  console.log(my_array);
  console.log(my_array.length);

});

firebugを使用すると、関数内で配列が正しく追加されていることがわかります。たとえば、console.logが返す単一の要素です。

my_array = ["0"]
my_array.length = 1

ただし、関数の後のconsole.log(firebugログに最初に表示される)は次のように表示されます。

my_array = [ ]
my_array.length = 1

ログを調べると、my_arrayは次のことを示します。

[ ]
0              "0"

誰かがこの動作を私に説明し、長さを呼び出してdb success関数の外で正しくループできるように配列を正しく追加する方法を説明できますか?

ありがとう!

4

2 に答える 2

1

zerkms は正しい: 変数は、成功のコールバック関数内で変更されています。$(document).ready-say-logAfterSuccess という関数に 2 番目の関数を追加します。

function logAfterSuccess()
{
    console.log(my_array);
    console.log(my_array.length);
}

成功のコールバック内からその関数を呼び出すだけです。

success: function()
{
    //code goes here
    logAfterSuccess();
}

それはあなたに期待される結果を与えるはずです

于 2012-05-04T10:59:03.697 に答える
0

コールバック関数の外側で配列をチェックしているため、最後の 2 つconsole.logは常に [] と 0 を返します。チェックをコールバック関数の内側に移動すると、目的の結果が得られるはずです。

例えば:

$(document).ready(function() {

  my_array = [];

  view_name = db_name+'/farms_by_name'
  $db.view(view_name, {
    success: function(data) {
       console.log(data)
       for (i in data.rows) {
           console.log(data.rows[i]);
           plot_name.push(data.rows[i].value.name);
           my_array.push("0");
           console.log(my_array);
           console.log(my_array.length);
        }
        afterArrayPopulated(my_array);
    },
    error: function(e) {
      alert('Error loading from database: ' + e);
    }
  });
});

function afterArrayPopulated(arr){
  console.log(arr)
  console.log(arr.length)
}
于 2012-05-04T10:56:06.477 に答える