[英]JavaScript jquery.ajax in success after loop nothing working
我需要將一些值傳遞給Javascript中的其他函數。 我已經從另一個PHP文件中獲取了值,但是無法將其傳遞給任何其他Javascript函數。 FOR LOOP之后,沒有任何事情可以成功進行。 需要幫忙?
url1 = 'http://localhost:81/Dashboard/admin/inc/dashboard.php';
$.ajax({
url: url1,
type: "POST",
dataType: "json",
success: function(data)
{
for(var i = 0; i <= 11; i++)
{
Month = data[i].Month;
Sales = data[i].Sales;
if (i == 0) global_ij = "[" + Month + "," + Sales + "]";
else global_ij = global_ij + "," + "[" + Month + "," + Sales + "]";
}
alert ("hello"); // this alert is also not working
}
});
那是因為您正在執行異步 AJAX操作。 換句話說,您在變量Month
, Sale
, global_ij
所做的賦值僅在該特定success
函數的范圍內可用, global_ij
在該范圍之外 。
一種解決方法是在AJAX調用中添加async: false
,這將迫使它退出異步行為,因此使您可以將分配給這些變量的值提供給所有其余代碼塊:
$.ajax({
url: url1,
async: false,
type: "POST",
dataType: "json",
success: function(data)
{
for(var i = 0; i <= 11; i++)
{
Month = data[i].Month;
Sales = data[i].Sales;
if (i == 0) global_ij = "[" + Month + "," + Sales + "]";
else global_ij = global_ij + "," + "[" + Month + "," + Sales + "]";
}
}
});
jQuery的AJAX調用返回會執行諸如.done()
.fail()
等方法的promise
對象。
另一方面,您還可以從AJAX調用中獲得承諾 (可以在Javascript代碼中的任何地方傳遞該承諾),並且當承諾被解析時調用它的.done()
處理函數。
var promise = $.ajax({/* settings */});
/* --- */
// promise passed to some other block of code
promise.done(function(){
//execute the block of code after the promise was resolved
});
看起來您的php返回8個元素,並且在您的成功方法中,循環迭代了11個項目,從而導致錯誤。
我分離了成功函數,並用您發布的數據進行了嘗試,並用data.length替換了循環中的11。 看一下下面的codepen:
http://codepen.io/anon/pen/OyXzGb?editors=011
請注意,我添加了
var Month;
var Sales;
將這些臨時變量保留在函數范圍內。
您可能需要檢查數據以查看它是否是正確的數組,以捕獲錯誤。 在此行之前:
for(var i = 0; i < data.length ; i ++)
最終輸出和一些嘗試的方法:
var global_ij="";
function processData(data) {
var Month;
var Sales;
for(var i = 0; i < data.length; i++)
{
Month = data[i].Month;
Sales = data[i].Sales;
if (i == 0) global_ij = "[" + Month + "," + Sales + "]";
else global_ij = global_ij + "," + "[" + Month + "," + Sales + "]";
console.log(global_ij);
}
return global_ij;
}
首先嘗試不使用ajax的此功能:
processData([{“ Month”:“ 1”,“ Year”:“ 2015”,“ Sales”:“ 19746.81”},
{“ Month”:“ 2”,“ Year”:“ 2015”,“ Sales”:“ 17902.26”},{“ Month”:“ 3”,“ Year”:“ 2015”,“ Sales”:“ 19223.84” },{“ Month”:“ 4”,“ Year”:“ 2015”,“ Sales”:“ 18840.88”},{“ Month”:“ 5”,“ Year”:“ 2015”,“ Sales”:“ 19889.97“},{” Month“:” 6“,” Year“:” 2015“,” Sales“:” 18509.85“},{” Month“:” 7“,” Year“:” 2015“,” Sales“ :“ 1886.81”},{“ Month”:“ 8”,“ Year”:“ 2015”,“ Sales”:“ 1740.34”}]));
您可能想使用.done()
修改您的代碼以在循環外聲明gloabla_ij變量。 像下面這樣
var global_ij='0';
url1 = 'http://localhost:81/Dashboard/admin/inc/dashboard.php';
$.ajax({
url: url1,
type: "POST",
dataType: "json",
success: function(data)
{
for(var i = 0; i <= 11; i++)
{
Month = data[i].Month;
Sales = data[i].Sales;
if (i == 0) global_ij = "[" + Month + "," + Sales + "]";
else global_ij = global_ij + "," + "[" + Month + "," + Sales + "]";
}
}
});
如果在文件頂部聲明var,則文件中的任何函數都可以使用它:
var global_ij; // declare variable in global scope of module/file
$.ajax({
url: 'http://localhost:81/Dashboard/admin/inc/dashboard.php',
type: "POST",
dataType: "json",
success: function(data) {
var i, month, sales, len = data.length;
for(i=0; i<=len; i++) {
month = data[i].Month;
sales = data[i].Sales;
if (i===0) global_ij = "[" + month + "," + sales + "]";
else global_ij = global_ij + "," + "[" + month + "," + sales + "]";
}
doSomething(); // can now call function after loop finished
}
});
func doSomething() {
// global_ij is now populated
}
PHP文件的響應為:
[
{"Month":"1","Year":"2015","Sales":"19746.81"}, // 1
{"Month":"2","Year":"2015","Sales":"17902.26"}, // 2
{"Month":"3","Year":"2015","Sales":"19223.84"}, // 3
{"Month":"4","Year":"2015","Sales":"18840.88"}, // 4
{"Month":"5","Year":"2015","Sales":"19889.97"}, // 5
{"Month":"6","Year":"2015","Sales":"18509.85"}, // 6
{"Month":"7","Year":"2015","Sales":"1886.81"}, // 7
{"Month":"8","Year":"2015","Sales":"1740.34"} // 8
]
然而你在循環
for(var i = 0; i <= 11; i++)
因此,當i >= 8
, data[i].Month
將引發“ data [i]未定義”錯誤。
只需使用.length
屬性即可:
for(var i = 0; i < data.length; i++)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.