Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Работы с callback функциями (https://javascript.ru/forum/misc/54589-raboty-s-callback-funkciyami.html)

jenek_34 23.03.2015 22:15

Работы с 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 функций. И что делать в процессе их выполнения...
Надеюсь описал понятно, если что не ругайтесь, а просто спросите:)
Всем добра!

tsigel 24.03.2015 08:27

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

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();

tsigel 24.03.2015 08:33

...
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);
		}
	});
}


Может быть так?

newuser1001 24.03.2015 11:05

Цитата:

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

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

?

tsigel 24.03.2015 11:42

newuser1001,
bind все знают) Он нужен для сохранения контекста, так как вы написали в методе someMethodWithResultAsync this будет равен window, а у меня SomeObject

newuser1001 24.03.2015 12:03

Цитата:

Сообщение от tsigel
в методе someMethodWithResultAsync this будет равен window, а у меня SomeObject

Цитата:

alert(result);
А где вы тут увидели this?
Цитата:

Сообщение от tsigel
bind все знают

Вопрос не в том кто что знает, а в том, зачем писать то, что писать не нужно.

tsigel 24.03.2015 12:15

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

Всегда пожалуйста.

newuser1001 24.03.2015 12:27

Цитата:

Сообщение от tsigel
Чтобы когда вы скопируте не было проблем с подключением.

C каким подключением? Это что такое?

newuser1001 24.03.2015 12:52

Цитата:

Сообщение от tsigel
ваш вопрос разрешился.

Нет не разрешился. Я так и не понял, зачем писать путанный код, который совершенно не нужен. Это может произойти, на мой взгляд только по одной причине: когда пишущий плавает в теме, но при этом пытается показать что он в ней разбирается, и он начинает писать "на всякий случай" различные нелепые конструкции, лишь бы работало, вводя, при этом, новичка в заблуждение.

tsigel 24.03.2015 12:59

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


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