2014-09-01 33 views
0

返回對象我有以下JavaScript代碼:問題從PHP查詢在Javascritpt功能

function requestUserList(){ 
     //El primer paso es obtener de PHP toda la información de los usuarios 
     var ret; 
     jQuery.ajax({ 
      type: "POST", 
      url: 'userfunctions.php', 
      dataType: 'json', 
      data: {functionname: 'all_user_data'}, 
      success: function (obj) { 
//    if (obj.error == ""){     
//     for (i = 0; i < obj.users.length; i++){ 
//     addAUser(obj.users[i],i); 
//     } 
//    } 
//    else{ 
//     postErrorMessage(obj.error); 
//    } 
        console.log("Number is " + obj.users.length); 
        ret = obj; 
       } 
     }); 
    console.log("Going back. N is " + ret.users.length); 
    return ret; 
    } 

的問題是,消息「數爲」在控制檯正確的值被印刷。但是,在第二個控制檯打印(「返回.N」)時,我收到用戶不是未定義屬性的錯誤。不知怎的,我錯誤地分配了返回值,但我不知道爲什麼。誰能幫我?我希望obj成爲函數的返回。

+1

可能重複[如何從Ajax調用返回響應?](http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call) – andrew 2014-09-01 11:41:12

+0

是的,我找錯了。辦法。但是,這是這個問題的重複。謝謝。 – aarelovich 2014-09-01 11:44:39

回答

0

你的功能是異步,所以你不能用這種方式回報您的期望值,您可以使用回調承諾,回調您的具體情況的一個例子:

function requestUserList(callback){ 
    jQuery.ajax({ 
     type: "POST", 
     url: 'userfunctions.php', 
     dataType: 'json', 
     data: {functionname: 'all_user_data'}, 
     success: function (obj) { 
      callback(obj); 
     } 
    }); 
} 

requestUserList(function (obj) { 
    console.log(obj); 
}); 
+0

謝謝你的解釋。 – aarelovich 2014-09-01 11:44:55

0

你有一個可變範圍錯誤。 var ret;僅爲函數範圍定義ret。然後用一個新的作用域聲明一個新的作用域,該作用域第二次隱式地聲明ret。

這樣,第一個ret與第二個ret完全無關。你需要調用成功函數中ret的任何需要。現在,返回值不會將值返回給您的函數,而是返回jQuery.ajax調用 - 並且在調用之後就會死掉。

此外,AJAX是異步的。這意味着你不知道什麼時候會完成 - 因此,你不能從那裏返回值。至少以合理的方式。

getSomething = function() { 
    $.ajax({ 
     url: url, 
     data: "", 
     type: 'GET', 
     success: doSuccessStuff, 
     error: doErrorStuff, 
    }); 
}; 

doSuccessStuff = function (data) { 
    // Have your stuff in data like data.myVariable 
}; 

你可以切換AJAX是同步的 - 然後從成功函數像這樣得到的數值:

getSomething = function() { 
    $.ajax({ 
     url: url, 
     data: "", 
     type: 'GET', 
     success: doSuccessStuff, 
     error: doErrorStuff, 
     async: false 
    }); 
}; 

doSuccessStuff = function (data) { 
    // Have your stuff in data like data.myVariable 
}; 

然而,這是一種不好的做法,因爲它會中斷程序流程,直到它要麼超時,要麼得到答覆。在成功調用中更好地堅持鏈接函數的正向執行。