Работы с 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 функций. И что делать в процессе их выполнения... Надеюсь описал понятно, если что не ругайтесь, а просто спросите:) Всем добра! |
Как то вы очень запутано написали. Смысл каллбеков в следующем:
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(); |
... 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); } }); } Может быть так? |
Цитата:
var SomeObject = { someMethod: function () { someAsyncFuncWithCallback(this.someMethodWithResultAsync) }, someMethodWithResultAsync: function (result) { alert(result); } } ? |
newuser1001,
bind все знают) Он нужен для сохранения контекста, так как вы написали в методе someMethodWithResultAsync this будет равен window, а у меня SomeObject |
Цитата:
Цитата:
Цитата:
|
newuser1001,
Конкретно в данном месте это может быть и не нужно, я показал пример с тем чтобы не потерять контекст. Чтобы когда вы скопируте не было проблем с подключением. Я смотрю вы разобрались в теме, и ваш вопрос разрешился. Всегда пожалуйста. |
Цитата:
|
Цитата:
|
newuser1001,
Ты победил, ты Бог джаваскрипта, а я не знаю нифига, возьми пирожок с полки. |
Часовой пояс GMT +3, время: 03:31. |