Javascript-форум (https://javascript.ru/forum/)
-   Библиотеки/Тулкиты/Фреймворки (https://javascript.ru/forum/library-toolkit-framework/)
-   -   Что-то типа семафоров на javascript (https://javascript.ru/forum/library-toolkit-framework/28089-chto-tipa-semaforov-na-javascript.html)

mkraer 07.05.2012 13:01

Что-то типа семафоров на javascript
 
Была поставлена задача - посчитать длину пути из одного города в другой по версии яндекс.карт и гугл.карт и . Это выполнено. Теперь заказчик просит добавить вычисление среднего значения. И вот тут загвоздка - ведь яндекс.карты и гугл.карты возвращают посчитанный путь асинхронно. Как поймать момент, когда и яндекс и гугл закончили работу?

B@rmaley.e><e 07.05.2012 15:47

Среднего значения чего?

mkraer 07.05.2012 20:30

Среднее между путём по яндексу и гуглу. Придумал решение, как сделать, чтоб пути считались по очереди, но всё же интересно, есть возможность оставить асинхронный подсчёт путей?

melky 07.05.2012 20:50

создаёте замыкание:
(function(){
    // код
})();

там размещаете две переменные, в которых будет храниться результат, и где-нибудь на внешней стороне функцию, которая будет обрабатывать два пришедших результата:
// считаем\выводим\ делаем что хотим с двумя пришедшими результатами
var count = function(goog, ya){
    var average = ((goog + ya) / 2).toFixed(3);
    alert(average);
};

(function(callback){
    var goog, ya; // пришедшие результаты

   goog.onLoad(function(request){ // <--- обработчик пришедшего результата для гугла
        goog = request.data;   // запоминаем значение
        if(ya){ // и от яндекса уже пришел результат
               callback(goog, ya);
        }
   });

    YMaps.addEventListener("load", function(e){ // <--- обработчик результата от яндекса
             ya = e.result; // запоминаем в переменной.
             if(goog){ // от гугла уже пришел результат
                  callback(goog, ya);
             }
    });
})( count ); // <--- сюда передаёте её как аргумент.

mkraer 07.05.2012 20:55

Спасибо!

Gvozd 08.05.2012 00:18

Если вы используете jQuery, то вы можете использовать Deferred
var q = jQuery.Deferred();
var w = jQuery.Deferred();
jQuery.when(q,w).then(function(a,b){
    //будет вызвано, когда известны результаты вычисления q и w(обоих)
    console.log(a,b);//123 456
});
q.resolve(123);//Это вставляем в обработчике яндекса, когда уже известен его путь
w.resolve(456);//Это вставляем в обработчике гугла, когда уже известен его путь


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