2014-03-05 147 views
0

我遇到了一些AJAX問題和我的數據範圍。我是Javascript新手,我不確定如何解決我的問題。Ajax和範圍問題

var urlList = new Array(); 
    $.ajax({ 
     url: "http://localhost:3000/url", 
     success: function(data) { 
     alert(data.expressions.url); //This shows the correct result 
     urlList[0] = obj.expressions.dom; 
     } 
    }); 

    alert(urlList[0]); //this shows undefined 

我需要在urlList[0]數據,所以我可以在以後使用它。我認爲這是一個範圍問題。

請問有人能指點我正確的方向嗎?

謝謝

+0

'obj.expressions.dom'從哪裏來? – Goose

回答

3

這不是範圍問題,而是時間問題。 ajax方法是異步執行的。這意味着調用它不會導致程序等待完成。這會導致在請求完成之前顯示警報。

要解決此問題,請將請求放入成功函數中。這是處理請求結果的適當位置。

var urlList = new Array(); 

$.ajax({ 
    url: "http://localhost:3000/url", 
    success: function(data) { 

     alert(data.expressions.url); //This shows the correct result 

     urlList[0] = obj.expressions.dom; 

     // This might work now, depending on what `obj.expressions.dom` is. This 
     // isn't becoming clear from your code. Usually you would use the `data` 
     // parameter of the success function, which contains the response body of 
     // the ajax request that has just finished. 
     alert(urlList[0]); 

     // of course you can call other functions as well. For instance, you 
     // could call 
     urlListChanged(); 
     // ..which you can declare in global scope. This way, you can repond to 
     // changes from multiple sources, without having to duplicate code. 
     // It will all work, as long as you use the success handler as the trigger. 
    } 
}); 


function urlListChanged() 
{ 
    alert(urlList[0]); 
} 
+1

棄用聲明:從jQuery 1.8開始,棄用jqXHR.success(),jqXHR.error()和jqXHR.complete()回調。要準備代碼以便最終刪除它們,請改用jqXHR.done(),jqXHR.fail()和jqXHR.always()。 – cjsmith

+0

@cjsmith好點,但超出了問題的範圍和答案,我想。我不想徹底改革OP的方法,只是想把重點放在這個問題上。使用'.done()'時,問題和解決方案是相同的。不過謝謝你的加入。 – GolezTrol

+1

感謝大家,現在有道理。 – d9120

1

你的問題是年表之一。

$.ajax激發一個異步請求,這意味着代碼中的其餘部分在請求解決之前將繼續執行。由於urlList僅在請求解決後才被填充,所以您的提醒發起得太早。

變化

$.ajax... 

var req = $.ajax... 

,並在成功回調包裹的提醒:

req.done(function() { alert(urlList[0]); }); 

...或者只是移動提醒您現有success回調裏面。