2013-11-06 4 views
1

Мне нужны результаты двух вызовов AJAX, после чего я буду использовать полученную информацию для создания таблицы.Два вызова функции AJAX - Лучшая практика

Мне было любопытно ... гнездовать один AJAX позвонить в другой и сохранить код для создания таблицы в конце 2-го AJAX назвать правильный способ достижения этого?

Благодарим за помощь.

+0

Можете ли вы подробно остановиться на прецеденте? – aviad

ответ

8

Я бы предложил использовать отложенные jQuery для этого.

$ajax1 = $.ajax({ 
    url: '/page1' 
}); 

$ajax2 = $.ajax({ 
    url: '/page2' 
}); 

$.when($ajax1, $ajax2).done(function(data1, data2){ 
    // data1[0] is the result of the 1st AJAX call, 
    // and data2[0] is the result of the 2nd 
    // Each argument is an array with the following structure: [ data, statusText, jqXHR ] 
}); 

Оба вызова AJAX уволят и .done будет работать только один раз как закончены.

Docs для $.when: http://api.jquery.com/jQuery.when/

+0

Просто набрал это! Согласен – megawac

+0

Это замечательно! Я никогда не знал, что это существовало. +1 – Overcode

+0

@megawac: Да, я не вижу причин их гнездовать, тем более, что они не полагаются друг на друга или что-то еще. –

0

Первые обещания хороший способ справиться с этим, но JQuery обещание не реализации внешних велик (это не спекуляция), но она работает. Если вы можете использовать другую библиотеку рекомендую q.js иначе вот как сделать это в JQuery

Я обычно использую .then к трубе возвращаемого значения второго АЯКС вызова и передать обещание вокруг

function makeRequests(){ 
    var req1 = $.ajax("myurl"); 

    return req1.then(function(data){ 
    var req2 = $.ajax("second/one") 


    return req2; 
    }) 
} 

makeRequest().done(function(dataFromReq2){ 
    //do work after both are done 
}) 

, если вам необходимо выполнить оба запроса параллельно, используйте $.when(req1, req2)

+1

Ваш 'return req2;' ничего не делает. Вы не можете вернуться из метода '.then'. –

+0

@RocketHazmat это просто неправда, вы можете вернуться от него, он работает как более старая версия $ .pipe() http://api.jquery.com/deferred.then/ –

+0

Хех. Не понял этого. Я думал, что «тогда» будет асинхронным, например, как обратные вызовы AJAX. –

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