簡體   English   中英

JavaScript jquery.ajax在循環后成功無法正常工作

[英]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操作。 換句話說,您在變量MonthSaleglobal_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","Sale‌​s":"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
    {"Mont‌​h":"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 >= 8data[i].Month將引發“ data [i]未定義”錯誤。

只需使用.length屬性即可:

for(var i = 0; i < data.length; i++) 

小提琴的例子

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM