2013-07-25 2 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 request и Access to restricted URI denied code: 1012. Первая ссылка предложила использовать метод jQuery getJSON, но этот метод работает только асинхронно. Вторая ссылка предлагает какой-то обратный вызов JSONP, но я не смог понять, как именно они работают.

Обратите внимание, что эта проблема легко исчезнет, ​​если я перемещу example.json в /web/example.json, но я хотел бы избежать этого из-за некоторых обстоятельств моей реальной проблемы (то, что я представил здесь, является упрощением моего актуальная проблема).

EDIT: Я пытаюсь это 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 Да. Попробуйте, решает ли ваша проблема? –

0

Междоменные запросы и данныеТип: запросы «jsonp» не поддерживают синхронную работу.

Look at documentation here.

Смежные вопросы