2009-08-27 4 views
2

У меня есть следующая функция, которая отлично работает, я использовал JSONP для преодоления кросс-домена, написал http-модуль для изменения типа контента и не добавил имя обратного вызова в URL-адрес.Как вернуть результат из вызова JSONP вне функции?

function AddSecurityCode(securityCode, token) { 
var res=0; 
$.ajax({ url: "http://localhost:4000/External.asmx/AddSecurityCode", 
    data: { securityCode: JSON.stringify(securityCode), 
     token: JSON.stringify(token) 
    }, 
    dataType: "jsonp", 
    success: function(json) { 
     alert(json); //Alerts the result correctly 
     res = json; 
    }, 
    error: function() { 
     alert("Hit error fn!"); 
    } 
}); 
return res; //this is return before the success function? not sure. 

}

переменная УЭ alwayes приходит не определено. и я не могу использовать async = false с jsonp. так как я могу вернуть результат вне функции? , и я обязательно сделаю это для вызовов подпоследовательностей.

Прошу совета, спасибо. Проблема в том, что я не могу вернуть значение результата вне этой функции

ответ

6

You simply cannot do this.

Вы должны переписать поток кода, так что AddSecurityCode принимает параметр callback (т.е. функция для запуска), которые затем вызвать внутри ваш успех обратного вызова:

function AddSecurityCode(securityCode, token, callback) { 

    $.ajax({ 
     .... 
     success: function(json) { 
      alert(json); //Alerts the result correctly 
      callback(json); // HERE BE THE CHANGE 
     } 
     .... 
    }); 
} 
+0

Спасибо, похоже, это единственный способ, я собирался вызвать функцию внутри успеха и цепочку, называющую это, но передача функции, как вы делали, более чистая , – Adel

0

Вы Рез объявленная внутри функции, что делает это сфера локальной для этой функции. Итак, есть начало. Объявите res вне функции и посмотрите, что произойдет.

0

Добавить асинхра: ложных объект запроса Ajax

$.ajax({ 
    ... 
    async: false, 
    ... 
}); 
return res; 

Но это не рекомендуется, так как он будет блокировать браузер и будет рассматриваться как не реагирует, пока Аякс вызова завершен. Процесс Async должен использовать функцию обратного вызова, как и другой ответ:

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