2013-05-08 71 views
0
var user_login_status = new Array(); 
$.getJSON(check_login_status, function (data) { 
    user_login_status['errorCode'] = data.errorCode; 
    user_login_status['message'] = data.message; 
    user_login_status['is_login'] = data.is_login; 
    // console.log("errocode " + user_login_status['errorCode']); 
    // console.log("messag e" + user_login_status['message']); 
    // console.log("is_login " + user_login_status['is_login']); 
}); 
console.log(user_login_status); 

...從getJSON函數中,數組內容打印正確,但不在函數外。我究竟做錯了什麼?數組未保存?

+4

AJAX:**異步** JavaScript和XML。 – elclanrs 2013-05-08 09:35:57

+0

把「console.log(user_login_status);」在回調函數 – ltebean 2013-05-08 09:38:07

+0

@Ibean:好的,但我仍然無法存儲數據,對吧? – 3zzy 2013-05-08 09:39:51

回答

1

現在,你可能有這樣的事情:

var user_login_status = {}; 
$.getJSON(check_login_status, function (data) { 
    user_login_status['errorCode'] = data.errorCode; 
    user_login_status['message'] = data.message; 
    user_login_status['is_login'] = data.is_login; 
}); 

// do something with the array 
doSomethingWith(user_login_status[ '...' ]); // <-- won't work 
doSomethingElse(); 
// etc etc 

兩個選擇:要麼延長回調包括函數/腳本的其餘部分:

var user_login_status = {}; 
$.getJSON(check_login_status, function (data) { 
    user_login_status['errorCode'] = data.errorCode; 
    user_login_status['message'] = data.message; 
    user_login_status['is_login'] = data.is_login; 

    // do something with the array 
    doSomethingWith(user_login_status[ '...' ]); 
    doSomethingElse(); 
    // etc etc 
}); 

或者,而不是一個匿名函數將回調和腳本的其餘部分放入一個已命名的函數中:

var user_login_status = {}; 
$.getJSON(check_login_status, restOfTheProgram); 

function restOfTheProgram(data) { 
    user_login_status['errorCode'] = data.errorCode; 
    user_login_status['message'] = data.message; 
    user_login_status['is_login'] = data.is_login; 

    // do something with the array 
    doSomethingWith(user_login_status[ '...' ]); 
    doSomethingElse(); 
    // etc etc 
} 

(另請注意,我將user_login_status變量更改爲一個對象; JavaScript沒有關聯數組。使用數組是因爲數組實際上是對象,但它可能會帶來一些意想不到的副作用。)

5

$.getJSON是一個異步函數,它在收到響應後調用回調函數。

您試圖在調用getJSON後立即打印結果並在獲得結果之前嘗試同步使用它。

你可以在Ajax調用async選項設置爲false,並有效地使是同步的,就像下面的代碼:

var user_login_status = null; 

var f = function() { 
    $.ajax({ 
     url: check_login_status, 
     dataType: 'json', 
     async:false, 
     success : function(data) { 
      user_login_status = data; 
     } 
    }); 
}; 

f(); 

console.log(user_login_status); 

但將阻止JavaScript引擎的瀏覽器,而不是可能的最好的主意。

+0

但我使用的JSONP總是ASYNC – 3zzy 2013-05-08 12:54:17

+0

@Nimbuz那麼你沒有太多的選擇。你必須使用回調。 – soulcheck 2013-05-08 13:12:13

+0

是的,這就是我一起去的,但很高興知道這一切。謝謝大家! :) – 3zzy 2013-05-08 13:17:15

1

$.getJSON函數是異步的。另外,您不應該使用Array進行關聯分配。閱讀關於here

var user_login_status = {}; 
$.getJSON(check_login_status, function (data) { 
    user_login_status = data; // this is enough 
    // The reference to data is not persistent. 
    console.dir(user_login_status); 
}); 
console.log(user_login_status); // this will execute before the server returns results.