Работы с 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, время: 10:49. |