2013-07-25 228 views
1

假設以下目錄結構:Syncrhonous跨域AJAX請求

/web 
    example.html 
    example.js 
/example.json 

我打開example.html的與我的瀏覽器,它運行example.js,它試圖同步使用加載在example.json數據以下調用:

$.ajax({url: "file:///example.json", 
     dataType: "json", 
     async: false, 
     success: function(data) { 
      console.log(data) 
     }, 
     error: function(request, status, error) { 
      console.log(request); 
      console.log(status); 
      console.log(error); 
     } 
}); 

這將導致一個錯誤與提示「訪問受限制的URI被拒絕」和錯誤代碼1012。到目前爲止,我已經採取了看看Access to restricted URI denied「 code: 」1012 - Cross domain Ajax requestAccess to restricted URI denied code: 1012。第一個鏈接建議我使用jQuery的getJSON方法,但此方法只能異步工作。第二個鏈接建議某種JSONP回調,但我一直無法理解這些工作如何。

請注意,如果我將example.json移動到/web/example.json中,這個問題很容易消失,但我想避免這種情況是由於我的實際問題(我在這裏提出的是簡化我的實際問題)。

編輯:我想這個JSONP代碼,但我還是遇到了同樣的錯誤:

$.ajax({url: "file:///example.json", 
    dataType: "jsonp", 
    success: function(data) { 
     console.log(data) 
    }, 
    error: function(request, status, error) { 
     console.log(request); 
     console.log(status); 
     console.log(error); 
    } 
}); 
+0

爲什麼它需要同步?爲什麼不直接延遲特定代碼的執行直到回調函數被觸發? –

+0

使用AJAX的原因是因爲它是異步的。原因是當你使它同步時丟失:( –

+0

@Vega我使用AJAX的原因是因爲它可以加載我的JSON數據,而不是因爲它是異步的。如果有替代品也可以加載我的JSON數據,我會 – abw333

回答

0

默認情況下跨域AJAX請求是不允許的。您需要使用CORS的其他服務器的許可,否則您可以使用JSONP。

+1

雖然JSONP不能同步。 –

+0

@Diodeus看看我剛剛對這個問題所做的修改。你知道它爲什麼不起作用嗎? – abw333

0

您對使用同步ajax的推理是錯誤的。如果您希望等到所有ajax請求完成,請使用以下方法。

var ajaxRequest1 = $.ajax(); 
var ajaxRequest2 = $.ajax(); 
var ajaxRequest3 = $.ajax(); 
$.when(ajaxRequest1, ajaxRequest2, ajaxRequest3).done(function(){}); 

這將是更爲高效/快於執行一系列在一個循環內同步AJAX請求。

+0

如果我不知道在運行時會執行多少個AJAX請求,該怎麼辦? (這取決於用戶輸入) – abw333

+0

然後你傳遞一個jqXHR對象的數組/集合。 '$ .when.apply($,ajaxRequestArray)' –

+0

@ abw333是的。試試吧,它能解決你的問題嗎? –