Вызов ajax 'GET' возвращает jsonp в порядке, но обратный вызов производит данные 'undefined'

Я получаю доступ к междоменному веб-сервису, используя вызов jquery an.ajax со страницы html. Хотя я могу видеть данные jsonp с помощью firebug, я не могу загрузить их в переменную или даже отобразить (для целей отладки). Попытки получить данные с помощью функций jsonpCallback, success и complete всегда приводят к неопределенным / нулевым данным.

В конечном итоге мне нужно сохранить данные в переменных. Мы будем благодарны за любую помощь!

$.ajax({
    data: {
        User: UserValue,
        GUID: GUIDValue
    },
    cache: false,
    dataType: "jsonp", // tried json
    type: "GET",
    crossDomain: true,
    jsonp: false,  // tried true
    jsonpCallback: function (saveData) {
        if (saveData == null) {
            alert("DATA IS UNDEFINED!");  // displays every time
        }
        alert("Success is " + saveData);  // 'Success is undefined'
    },
    url: "http://localhost/NotifMOD/NotifService.svc/GetAllMessages?callback=success?",
    async: false, // tried true
    error: function (XMLHttpRequest, textStatus, errorThrown) {
         console.log(textStatus, errorThrown);
    },
    complete: function (a, b) {
        alert(a); //[object Object]
        alert(b); // parseerror
    }
});

person rsamoose    schedule 25.04.2012    source источник


Ответы (1)


В JSONP вы должны определить свою функцию в своем коде.

jsonpCallback должно быть именем этой функции, а не самой функции.

См. http://api.jquery.com/jQuery.ajax/.

Вы делаете это так:

function receive(saveData) {
    if (saveData == null) {
            alert("DATA IS UNDEFINED!");  // displays every time
    }
    alert("Success is " + saveData);  // 'Success is undefined'
}

$.ajax({
    data: {
        User: UserValue,
        GUID: GUIDValue
    },
    cache: false,
    dataType: "jsonp", // tried json
    type: "GET",
    crossDomain: true,
    jsonp: false,  // tried true
    jsonpCallback: "receive",
    url: "http://localhost/NotifMOD/NotifService.svc/GetAllMessages?callback=receive?",
    async: false, // tried true
    error: function (XMLHttpRequest, textStatus, errorThrown) {
         console.log(textStatus, errorThrown);
    }
});
person Denys Séguret    schedule 25.04.2012
comment
Спасибо dystroy за ответ. Я попробовал ваше предложение (с добавлением изменения URL-адреса на _http: //localhost/NotifMOD/NotifiService.svc/GetAllMessages? Callback = jsonpCallback?). Теперь функция ошибки: параметр errorThrown возвращает Ошибка: прием не был вызван. - person rsamoose; 26.04.2012
comment
Имя функции (здесь получение) должно совпадать с именем в начале ответа jsonp. В моем коде была ошибка (при условии, что сервер использует параметр обратного вызова). URL-адрес должен заканчиваться на callback = receive. - person Denys Séguret; 26.04.2012
comment
Может быть, это поможет вам: открытый исходный код, который я делаю. Клиент: github.com/Canop/braldop/blob/master/ chrome / braldop / и сервер: github .com / Canop / braldop / blob / master / go / src / braldopserver /. - person Denys Séguret; 26.04.2012
comment
@Jake Это ответ 2012 года, когда JSONP все еще имел смысл. Сейчас 2017 год, JSONP мертв. Если вы обнаружите, что API требует от вас использовать JSONP, используйте другой API. - person Denys Séguret; 13.06.2017