Клуб API Карт

Не работает отложенная загрузка loadByRequire=1

Пост в архиве.

Подключил параметр loadByRequire=1 к работающей карте (которая загружается по клику на ссылку).

Перестало работать. Судя по всему API  загружается как-то странно.

Как все устроено:

По клику на ссылке запускается вот это с колбэком YaMapInit:

YMaps.load(YaMapInit(addr,name));

вот определение YaMapInit:

function YaMapInit (locationaddr,locationname) {
  map = new YMaps.Map( document.getElementById("maparea") );

....

И здесь на первой же строке вылетает с ошибкой "YMaps.Map is not a constructor";

То есть API YMaps.load съело, а YMaps.Map нет!

7 комментариев
Александр Новиков
28 января 2016, 06:32
У код неправильно написан ;)

Если разбирать ваш пример, то сначала вызывается функция YaMapInit а только потом вызывается YMaps.load

И как callback фyнкция используется некое значение, которое возвратила YaMapInit

Попробуйте переписать следующим образом
YMaps.load(function(addr, name){ YaMapInit(addr,name);});

С последовательностью вызовов все в норме. Функция YaMapInit  вызывается после загрузки API и всего документа и не вручную, а как  callback. Пользователь нажимает ссылку вида чем и инициирует весь процесс:

function Yaonoff(marea,addr,name) {
    if (marea.style.display=="none") {
        marea.style.display="";
        if (map == null) YMaps.load(YaMapInit(addr,name));
    }
    else{
        marea.style.display="none";    
    }
}
Александр Новиков
28 января 2016, 06:32
Не в норме.

Не буду вам объяснять принципы построения интерпретаторов и компилятор.

Но в вашей записи идет следущий порядок вызова
1. Вызывается функция YaMapInit
2. Она выполняет свой код (закроем глаза на то что там ошибка и она по сути не выполняется) и возвращает некоторое значение.
3. Это значение используется как аргумент при вызове YMaps.load

Так что лучше сделайте как я сказал или хотя бы напишите
YMaps.load(YaMapInit);
вдруг заработает ;)
Вы представляете себе как работает callback?
В YMaps.load передается указатель на функцию которую нужно вызвать после загрузки движка.
YaMapInit выполняется после YMaps.load.
Александр Новиков
28 января 2016, 06:32
Я-то представляю. А вот вы похоже настолько уверены в собственно правоте что даже не попробовали предложенные мной варианты, а сидите с нерабочим кодом и обвиняете во всем АПИ.

спасибо Вам, добрый человек, я тоже была уверена что это одно и то же!

 А чел не ответил, потому что думаю у него все заработало))

Александр Новиков
28 января 2016, 06:32
Кстати в тему про каллбеки...
Я тут заморочился и наваял небольшой примерчик: http://scripts.pws.ru/callback.html

Думаю разберетесь что к чему.