Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.11.2011, 09:01
Кандидат Javascript-наук
Отправить личное сообщение для posta Посмотреть профиль Найти все сообщения от posta
 
Регистрация: 27.08.2010
Сообщений: 115

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

Есть код:
//общая функция для 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 - выставлять очередность функции, но не могу найти.
Ответить с цитированием
  #2 (permalink)  
Старый 22.11.2011, 10:10
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

есть три способа получить ответ (результирующий текст)
  • сделать запрос синхронным. тогда ваша конструкция будет полностью рабочей. но это сопровождается замораиванием интерфейса на время совершения запроса. притормаживать будет
    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 Посмотреть сообщение
Вроде слышал, как то можно решить с помощью нового jQuery - выставлять очередность функции, но не могу найти.
Deferred. фича уже не новая. я в неё не вникал, но вы можете почитать доки по этому объекту.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
расставить в порядке убывания qwertyuiop10 Общие вопросы Javascript 13 04.10.2011 18:10
Обход массива в строгом порядке nibble Общие вопросы Javascript 35 03.12.2010 13:38