vladimir7517, вариант с флагом может выглядеть так:
var workerFlag; // пустой флаг в поле видимости обеих функций
function worker(параметры){ // часть функции, отвечающая за повторный запрос
workerFlag = 1; // активируем флаг
$.ajax({
complete: function() {
if (workerFlag == 1){ // проверяем флаг
setTimeout(worker, 3000);
}
}
});
}
$('.openMap').click(function(){ // какое-либо действие/событие, возможно открытие новой карты
workerFlag = 0; // обнуляем флаг, следующий setTimeout уже не запустит функцию worker
// дождаться завершения последнего таймаута - не лучшее решение
// дальнейшие действия - видимо запускаем функцию worker с новыми параметрами
});
Но здесь сталкиваемся с трудностью - если функция вызывает сама себя, setTimeout даёт задержку перед запуском новой функции в случае остановки текущей (чтоб проверить флаг).
Лучше переосмыслить подход. Например, использовать флаг только для остановки повторного запуска функции (возможно закрытие карты), а при каждом запуске функции проверять передаваемые ей параметры. Если нажали открыть другую (следующую) карту, передавать функции worker новые параметры (id нового запроса, какую карту открывать, где открыть). А в setTimeout проверять id запроса.
Почитайте
как передать параметры функции, и ещё про
deffered.