 
			
				02.06.2009, 18:39
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 10.05.2009 
					
					
					
						Сообщений: 57
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
			
			 
				Как "подождать" выполнение асинхронного запроса?
			 
			
		
		
		
		
function hasChildren(id) {
	var dicHasChildren = false;
	jQuery.post(url, 
			{"sydicId": id}, 
	function(resp) {
		dicHasChildren = resp;
	});	
	return dicHasChildren;
}
function confirmDelete(obj, link) { 
        var msg = "Вы действительно хотите удалить словарь?";
    	if (hasChildren(sydicId)) 
    		msg = "Словарь содержит подсловари. Вы действительно хотите удалить словарь?";
    	
	    var ans = confirm(msg);
        ....
Суть в следующем. Функция confirmDelete запрашивает подтверждение при удалении словаря. Функция hasChildren проверяет, не содержит ли словарь подсловари, c помощью ajax-запроса, и если содержит, то текст предупреждения должен измениться.   
Проблема в том, что функция hasChildren возвращает значение не дожидаясь выполнения callback-функции, которая передается в jQuery.post и соответственно возвращаемое значение всегда остается одинаковым. Как заставить функцию hasChildren подождать выполнения запроса к серверу?  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				02.06.2009, 19:06
			
			
			
		  
	 | 
 
	
		
		
		
			
			
			
				
				
				
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 10.07.2008 
					
					
					
						Сообщений: 3,873
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Так раз вы понимаете, что запрос асинхронный, значит нужно выполнять не синхронно, не пытаться сделать так, чтобы можно было подождать, а с помощью callback-функции: 
function confirmDelete(obj, link) { 
	var msg = "Вы действительно хотите удалить словарь?";
	var dicHasChildren = false;
	jQuery.post(url, {"sydicId": id}, function(resp) {
		dicHasChildren = resp;
		if (dicHasChildren) {
			msg = "Словарь содержит подсловари. Вы действительно хотите удалить словарь?";
			var ans = confirm(msg);
		}
	});    
}
 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				03.06.2009, 15:19
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 10.05.2009 
					
					
					
						Сообщений: 57
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Я первоначально так и делал.  Сейчас понял, что происходило. 
function confirmDelete(obj, link) {
        var msg = "Вы действительно хотите удалить словарь?";
    	var ans;
    	jQuery.post(    url, 
    			{"sydicId": sydicId}, 
    	function(resp) {
    		
			if (resp) { 
				msg = "Словарь содержит подсловари. Вы действительно хотите удалить словарь?";
			}
			ans = confirm(msg);
       	});	
    	alert(ans);  //выводит раньше чем выполнилась callback-функция
    	
    	return ans ? true : false;
}
Если убрать алерт перед return, то возврат из функции будет происходить раньше, чем появилось окно confirm.  То есть функция всегда возвращала false(или undefined, что равнозначно).   
alert притормаживает выполнение функции, и ajax успевает отработать. 
То есть я сейчас вижу только один выход - поставить перед return таймаут с каким-то фиктивным действием, чтобы не дать функции confirmDelete завершиться, прежде чем появится окно confirm.  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				03.06.2009, 15:21
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Новичок на форуме 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 19.02.2008 
					
					
					
						Сообщений: 9,177
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 По-моему, вы не понимаете самого принципа асинхронности. 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				03.06.2009, 16:18
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 10.05.2009 
					
					
					
						Сообщений: 57
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 Принцип асинхронности в данном случае проявляется в том, что пока идет запрос к серверу скрипт выполняется дальше.  А выполнить возврат из функции confirmDelete в callback-функции я не смогу(научите, если знаете как). 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				03.06.2009, 16:20
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Новичок на форуме 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 19.02.2008 
					
					
					
						Сообщений: 9,177
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Если вы хотите получить какие-то данные от асинхронной функции, то нужно передавать ей callback. 
function confirmDelete(obj, link, callback) // вместо return result; будет callback(result);
  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				03.06.2009, 17:08
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 10.05.2009 
					
					
					
						Сообщений: 57
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Не совсем понял синтаксис. 
function confirmDelete(obj, link, onAjaxSuccess) {
        var msg = "Вы действительно хотите удалить словарь?";
        var ans;
        jQuery.post(    url, 
                {"sydicId": sydicId}, 
        onAjaxSuccess);    
        
 
        return onAjaxSuccess(ans) ? true : false;
}
function onAjaxSuccess(resp) {
 
            if (resp) { 
                msg = "Словарь содержит подсловари. Вы действительно хотите удалить словарь?";
            }
            ans = confirm(msg);
           }
? onAjaxSuccess not a function 
В строке с return.  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				03.06.2009, 17:10
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 10.05.2009 
					
					
					
						Сообщений: 57
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 Мне нужно получить то, что приходит в параметре resp. 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				03.06.2009, 17:20
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Новичок на форуме 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 19.02.2008 
					
					
					
						Сообщений: 9,177
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
function confirmDelete(obj, link, callback) {
    $.post(url, {}, callback);
}
confirmDelete({}, 'link', function() {
    alert('Удалили');
});
 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				03.06.2009, 17:44
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 10.05.2009 
					
					
					
						Сообщений: 57
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Вызов confirmDelete 
onClick="return confirmDelete('syDictionary', this, onAjaxSuccess);"
Скрипт
 
function confirmDelete(obj, link, callback) {
        var msg = "Вы действительно хотите удалить словарь?";
        var ans;
        jQuery.post(    url, 
                {"sydicId": sydicId}, 
        callback);    
 
 
        return /*что здесь?*/ ? true : false;
}
 
function onAjaxSuccess(resp) {
 
            if (resp) { 
                msg = "Словарь содержит подсловари. Вы действительно хотите удалить словарь?";
            }
            ans = confirm(msg);
           }
Вот тут  
 
return /*что здесь?*/ ? true : false;
 
у меня в условии должно оказаться значение которое вернул confirm в callback-функции. Как это сделать?  
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось WalterScott, 03.06.2009 в 17:46.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 |  
  |