2011-11-10 23 views
1

我想在這個JavaScript函數複製一個JSON數組的數組:複製從一個jQuery Ajax調用

var test = new array(); 
function showUser(user, pass, remember) 
{ 
    $.getJSON("login.php", { username : user, password : pass, check : remember }, function(data){ 
    for (var i = 0; i<data.length; i++) 
    { 
     alert(data[i]); 
     test[i] = data[i]; 
    } 
    }); 
    alert(test[0]); 
} 

下面是它鏈接到PHP文件;

<?php 
$arr = array("test1", "test2", "test3"); 

echo json_encode($arr); 
?> 

問題是我需要兩次運行該函數,以便我的測試數組包含某些內容,否則它仍然未定義。我該如何解決?

+1

哦你的代碼格式很容易誤導...... for語句在回調函數中,但最後一個alert()函數不是......在JSON回調之前調用alert()所以'undefined'是期望的值。 –

+0

你能提供更多的上下文嗎? showUser從哪裏被調用? – fehays

+0

對不起,格式是誤導性的,我一直試圖讓這個工作一段時間,並且在這個過程中有點討厭。 showUser被一個按鈕調用。 – Sefam

回答

3
var test = new array(); 
function showUser(user, pass, remember) 
{ 
    $.getJSON("login.php", { username : user, password : pass, check : remember }, function(data){ 
     for (i in data) 
     { 
      test[i] = data[i]; 
     } 
     alert(test[0]); 
    }); 
} 

正如ŠimeVidas所述,您的警報超出了回調函數的範圍,所以它在數據通過AJAX調用返回之前被調用。這就是爲什麼第二次點擊你的按鈕提醒你所期望的,因爲它在回調函數運行後才存在。

雖然,而不是通過data變量,爲什麼不設置testdata價值循環:

test = data; 
+0

因此,無法將數據放入AJAX調用之外的範圍內的變量中?這就是爲什麼警報不在通話中。我試圖把數據數組放在測試數組內部以在外部使用。至於我爲什麼要循環,做你的建議並沒有給我想要的結果。 – Sefam

+1

您的'test'變量是全局變量,因此它可以在任何地方訪問,但AJAX調用是異步的,這意味着它們允許其他代碼在AJAX調用等待響應時運行。因此,您可以訪問回調函數外部的數據,但是您必須等待回調函數在數據可用之前運行。我建議使用Firebug這樣的開發工具,它可以讓你實時查看發送的請求。 – Jasper

+0

那麼如何訪問回調之外的數據呢?我不確定我明白。我可以訪問回調中包含的數據,爲什麼我不能將它傳遞給我的測試數組? – Sefam

1

最簡單的方法來複制一個數組是slice

test = data.slice(0); 
+1

只是'data.slice()'也可以工作(因爲'ToInteger(undefined)'計算爲'0')。 –