Добрый день! Сломал голову, как осуществить такую фишку
function getPrice(n){
function onAjaxSuccess(data)
{
return data;
}
$.get(
"prices/functions.php",
{
n: n
},
onAjaxSuccess
);
}
Подскажите, как передать data в самой getPrice и вернуть его через return? Заранее благодарен!
Если подходить к вопросу строго: jQuery поддерживает синхронные вызовы, т.е. такие, при которых выполнение скрипта прекращается, пока не получен ответ:
var data; // в данный момент undefined
$.ajax({
async: false,
url: '/',
success: function(_data) {
data = _data; // data указывает на переменную из внешней области видимости
}
});
// так как на время выполнения $.ajax код прекратил выполнение, data уже заполнена
Однако так делать не стоит. Строго говоря, это должно заблокировать браузер до конца запроса (не знаю, как будет в реальности, и наверняка поведение различается от браузера к браузера), да и вообще парадигма яваскрипта такие штуки не предусматривает. Вместо этого в яваскрипте все делается на коллбэках (о чем вы наверняка знаете, но на всякий):
$.ajax({
url: '/',
success: function (data) {
// функция, которая будет выполнена по завершению запроса
}
})
Конечно, это не очень удобно, и становится еще менее удобным, когда в одном месте нужно сделать несколько последовательных запросов. Эта проблема решается с помощью т.н. promise - конструкции, которая выполняет тот или иной коллбек в случае удачного или неудачного завершения. В этом случае метод может вернуть этот самый promise вместо реальных данных, и клиентский код будет видеть только один объект, куда нужно подключить коллбек. Таким образом можно обернуть сразу несколько методов (attention: я в этом пока не мастер, наверняка более маститые пользователя приведут пример лучше / отредактируют этот ответ):
var api = {
registerCustomer = function () {
return $.ajax({ ... });
}
activateCustomer = function () {
return $.ajax({ ... }));
}
sendGrettingLetter = function () {
return $.ajax({ ... });
}
};
$('register-form').on('submit', function () {
api.registerCustomer() // сначала выполнится этот метод
.done(api.activateCustomer) // после завершения - этот
.done(api.sendGreetingLetter); // и, наконец, финальный
});
Как в этом случае передавать вовращаемые данные - я, честно говоря, не знаю, но этот точно есть в документации, и, скорее всего, такая штука сработает:
function getCartProducts() {
return $.ajax({ url: '/api/v1/cart' })
.done(function (data) { return data.products; });
}
function iterateProducts(products) {
for (var key in products) {
// что-нибудь
}
}
getCartProducts.done(iterateProducts);
Постараюсь до завтрашнего вечера поковырять поподробнее.
Переделайте логику, пусть onAjaxSuccess устанавливаются значения элементов или тригерятся события.
У вас скорей всего выполнение идет как-то так
function init(obj){
obj.price = getPrice();
obj.quantity = getQuantity();
...
}
можно
function init(obj){
setPrice(obj, 100);
setQuantity(obj, 200);
}
function setPrice(obj, n){
function onAjaxSuccess(data)
{
obj.price = data;
};
$.get("prices/functions.php",
{
n: n
},
onAjaxSuccess
);
}
Update:
Можно и с передачей функции, как ВОРОН предлагает
function init(){
onSetPrice(100, funtion(){
...
});
onSetQuantity(200, function(){
...
});
}
function onSetPrice(n, fn){
$.get("prices/functions.php",{
n: n
},
fn
);
}
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Виртуальный выделенный сервер (VDS) становится отличным выбором
Здравствуйте,я генерирую в div таблицу,которая может внутри родителя перемещатьсяПо нажатию на див,в alert мне выдается содержимое div и там в атрибут...
Есть iframe, который я формирую, в нем input'ы [type='radio']Мне нужно узнать какой radiobutton выбран