Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   ассинхронность в порядке очечереди (https://javascript.ru/forum/misc/23392-assinkhronnost-v-poryadke-ochecheredi.html)

posta 22.11.2011 09:01

ассинхронность в порядке очечереди
 
Ребята, подскажите как сделать так, чтобы одна аякс функция выполнялась, когда другая закончит отработку.

Есть код:
//общая функция для ajax
function __get (d) {
	$.ajax({type: 'POST',url: "modules/server.php",
				data : d,
				success : get_success,
				error:  get_error
			});
	function get_success(r){
		if (r.status) return r; else return r.res;
	}
	function get_error(r){alert ('Ошибка!');}
}

....

var res=__get({ "operation" : "get_com", "id" : node.id });
comments=res.Data; 
/* в этом случае функция __get не успевает отработать и передать comments параметры. comments==undefined*/


Как сделать так чтобы присвоение было только после как функция __get возвратит результат?

Сразу оговорюсь, что это одна функция имеет множество вхождений по коду. и решил сделать одну функцию, вместо того чтобы писать в коде развернутые $.ajax или $.post функции (т.е. с своими success и error).

setTimeout - лишь задерживает код на время, и не гарантирует, что функция завершиться вперед.

Вроде слышал, как то можно решить с помощью нового jQuery - выставлять очередность функции, но не могу найти.

melky 22.11.2011 10:10

есть три способа получить ответ (результирующий текст)
  • сделать запрос синхронным. тогда ваша конструкция будет полностью рабочей. но это сопровождается замораиванием интерфейса на время совершения запроса. притормаживать будет :)
    function __get (d) {
    	var myreq = $.ajax({type: 'POST',url: "modules/server.php",
    				data : d,
    *!*
    				async : false,
    */!*
    			});
    *!*
            return myreq.responseText;
    */!*
    }
    var res=__get({ "operation" : "get_com", "id" : node.id });
    
  • указать функцию обратного вызова. в этом случае пришедший текст будет доступен только тогда, когда ajax-запрос завершится. т.е. манипулировать с текстом будет чуточку не так, как в вашем коде
    //общая функция для ajax
    function __get (d, callback) {
            // если не передана, то используем функцию-пустышку.
            if(!callback) callback = $.noop;
    
    	$.ajax({type: 'POST',url: "modules/server.php",
    				data : d,
    				success : *!*callback*/!*,
                                    error : ajerror
    			});
            function ajerror(){ /*ошибка*/ }
    }
    
    ....
    
    function myclb(result){
        var res = result;
        comments=res.Data; 
    }
    
    __get({ "operation" : "get_com", "id" : node.id }*!*,myclb*/!*);
    
  • использовать deferred. это то же самое, что и использование функции обратного вызова.
    //общая функция для ajax
    function __get (d, callback) {
            // если не передана, то используем функцию-пустышку.
            if(!callback) callback = $.noop;
    
    	$.when( $.post("modules/server.php",d) ).done(callback).fail(ajerror);
    
            function ajerror(){ /*ошибка*/ }
    }
    
    ....
    
    function myclb(result){
        var res = result;
        // .....
    }
    
    __get({ "operation" : "get_com", "id" : node.id }*!*,myclb*/!*);
    



Цитата:

Сообщение от posta (Сообщение 138291)
Вроде слышал, как то можно решить с помощью нового jQuery - выставлять очередность функции, но не могу найти.

Deferred. фича уже не новая. я в неё не вникал, но вы можете почитать доки по этому объекту.


Часовой пояс GMT +3, время: 01:38.