Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.03.2015, 22:15
Новичок на форуме
Отправить личное сообщение для jenek_34 Посмотреть профиль Найти все сообщения от jenek_34
 
Регистрация: 24.02.2015
Сообщений: 4

Работы с callback функциями
Здравствуйте! У меня такой вопрос...
В объекте вызываю метод. В этом методе выполняется функция, а в ней callback функция. Выполняется она не быстро и нужно отловить момент, когда она закончит выполняться и вернула результат.
Как лучше это сделать? Читал на форуме, что можно в callback функции создать новую функцию, которая выполнится по завершению. Это работает, но нужно чтобы сам метод вернул результат. Додумался через setInterval каждые 50мс отслеживать не пришло ли туда что-нибудьх.Вообщем запутал, наверное, вот код:
Это метод:
resultTripMethod: function(){var infoRoude = viewRoude(directionService, directionRenderer, this.from, this.to);

Это функция, в которой выполняется callback функция
function viewRoude(directionService, directionRenderer, start, end){
	console.log(1);
	var request = {
		origin: new google.maps.LatLng(start.pos.lat, start.pos.lng),
		destination: new google.maps.LatLng(end.pos.lat, end.pos.lng),
		travelMode: google.maps.TravelMode.DRIVING
	};
	var a;
	directionService.route(request, function(result, status){
		if(status == google.maps.DirectionsStatus.OK){
			a = result;
			finish(a);
		}
	});
	
	function finish(res){//Отлов с новой функцией
		console.log(res);
		//Как ее вернуть в метод...
	}
	
	var timer = setInterval(function(){//Отлов с помощью setInterval
		if(a != undefined){
			clearInterval(timer);
			console.log(a);
			return a;
		}
	}, 50);
	
}


И еще нужно отлавливать в самом начале (в объекте в переменную infoRoude) не пришел ли результат.
Наверняка есть универсальный способ отлова завершению callback функций. И что делать в процессе их выполнения...
Надеюсь описал понятно, если что не ругайтесь, а просто спросите
Всем добра!
Ответить с цитированием
  #2 (permalink)  
Старый 24.03.2015, 08:27
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Как то вы очень запутано написали. Смысл каллбеков в следующем:

var someAsyncFuncWithCallback = function (callback) {

   setTimeout(function () {
   
      //Мы сделали что-то дофига асинхронное! Возвращаем результат!
      callback("success");

    }, 500); 

};

var SomeObject = {

   someMethod: function () {

        //Допустим нам надо сделать что-то асинхронное и отправить результаты в 
        // this.someMethodWithResultAsync
        someAsyncFuncWithCallback(function (result) {
            this.someMethodWithResultAsync(result);
        }.bind(this))
       

   },

    someMethodWithResultAsync: function (result) {

       alert(result);

    }

};

SomeObject.someMethod();
Ответить с цитированием
  #3 (permalink)  
Старый 24.03.2015, 08:33
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

...
resultTripMethod: function(){
   viewRoude(directionService, directionRenderer, this.from, this.to, function (result) {
      console.log(result)
   }.bind(this));
}
...

function viewRoude(directionService, directionRenderer, start, end, callback){
	var request = {
		origin: new google.maps.LatLng(start.pos.lat, start.pos.lng),
		destination: new google.maps.LatLng(end.pos.lat, end.pos.lng),
		travelMode: google.maps.TravelMode.DRIVING
	};
	directionService.route(request, function(result, status){
		if(status == google.maps.DirectionsStatus.OK){
			callback(result);
		}
	});
}


Может быть так?
Ответить с цитированием
  #4 (permalink)  
Старый 24.03.2015, 11:05
Аспирант
Посмотреть профиль Найти все сообщения от newuser1001
 
Регистрация: 24.03.2015
Сообщений: 92

Сообщение от tsigel
Как то вы очень запутано написали.
Вы как-то тоже. Зачем Вам там эти сопли с bind? чтобы никто не понял? Почему не
var SomeObject = {
   someMethod: function () {
        someAsyncFuncWithCallback(this.someMethodWithResultAsync)
   },
    someMethodWithResultAsync: function (result) {
       alert(result);
    }
}

?
Ответить с цитированием
  #5 (permalink)  
Старый 24.03.2015, 11:42
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

newuser1001,
bind все знают) Он нужен для сохранения контекста, так как вы написали в методе someMethodWithResultAsync this будет равен window, а у меня SomeObject
Ответить с цитированием
  #6 (permalink)  
Старый 24.03.2015, 12:03
Аспирант
Посмотреть профиль Найти все сообщения от newuser1001
 
Регистрация: 24.03.2015
Сообщений: 92

Сообщение от tsigel
в методе someMethodWithResultAsync this будет равен window, а у меня SomeObject
Цитата:
alert(result);
А где вы тут увидели this?
Сообщение от tsigel
bind все знают
Вопрос не в том кто что знает, а в том, зачем писать то, что писать не нужно.
Ответить с цитированием
  #7 (permalink)  
Старый 24.03.2015, 12:15
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

newuser1001,
Конкретно в данном месте это может быть и не нужно, я показал пример с тем чтобы не потерять контекст. Чтобы когда вы скопируте не было проблем с подключением. Я смотрю вы разобрались в теме, и ваш вопрос разрешился.

Всегда пожалуйста.
Ответить с цитированием
  #8 (permalink)  
Старый 24.03.2015, 12:27
Аспирант
Посмотреть профиль Найти все сообщения от newuser1001
 
Регистрация: 24.03.2015
Сообщений: 92

Сообщение от tsigel
Чтобы когда вы скопируте не было проблем с подключением.
C каким подключением? Это что такое?
Ответить с цитированием
  #9 (permalink)  
Старый 24.03.2015, 12:52
Аспирант
Посмотреть профиль Найти все сообщения от newuser1001
 
Регистрация: 24.03.2015
Сообщений: 92

Сообщение от tsigel
ваш вопрос разрешился.
Нет не разрешился. Я так и не понял, зачем писать путанный код, который совершенно не нужен. Это может произойти, на мой взгляд только по одной причине: когда пишущий плавает в теме, но при этом пытается показать что он в ней разбирается, и он начинает писать "на всякий случай" различные нелепые конструкции, лишь бы работало, вводя, при этом, новичка в заблуждение.
Ответить с цитированием
  #10 (permalink)  
Старый 24.03.2015, 12:59
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

newuser1001,
Ты победил, ты Бог джаваскрипта, а я не знаю нифига, возьми пирожок с полки.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Предложение Работы annaPTS-Russia.com Работа 1 22.07.2014 01:34
Работа с textarea Rompo Events/DOM/Window 14 16.12.2013 17:41
Callback работает не так как я от него жду singaporian Общие вопросы Javascript 3 14.08.2013 00:42
В callback функции теряется контекст. Как это обойти? xintrea AJAX и COMET 4 02.06.2013 11:40
Модуль для работы с модулями JSprog Ваши сайты и скрипты 29 02.09.2009 13:31