2015-03-24 3 views
0

У меня есть три функции, которые работают с данными глобального объекта. Этот глобальный объект заполняется данными из локального массива в одной функции и данными из запроса ajax со второй функцией. Третья функция зависит от данных в объекте, поэтому запрос ajax должен быть завершен.как обрабатывать асинхронно: функция C зависит от функции B в зависимости от функции A

Я считаю, что ошибаюсь в обратных вызовах. Вот что я делаю:

var currentCharacter = {} 

// this function gets the local data and then calls the second function 
function loadData(getMarvelData) { 
    // do things to fill currentCharacter 
    getMarvelData(); // this is the callback to the next function (no ?) 
} 

// this function performs the ajax request, then calls the third function 
function getMarvelData(getGoogleMap) { 
    // do ajax request and add stuff to currentCharacter 
    getGoogleMap(); // this is the callback to the final function (no ?) 
} 

function getGoogleMap() { 
    // do Google Map related stuff with data from currentCharacter 
} 

Я думал, установив функцию в качестве аргумента другой функции, а затем выполняет это сделает функция зависит от другого, прежде чем она продолжается. Ясно, что я все еще неправильно понимаю обратные вызовы, пытаясь заставить его работать уже неделю. Как бы то ни было, функция getMarvelData даже не вызывается, потому что я никогда не вижу всплывающее окно предупреждения, а у объекта currentCharacter есть только данные из функции loadData.

Может ли кто-нибудь показать правильный подход для моего кода, или если мой подход к выполнению этих трех функций является даже правильным для этого сценария.

Полный репозиторий доступен по адресу: https://github.com/ChaMbuna/Marvel-Map v0.9 был на самом деле работает, но вызов Ajax был настроен на запуск синхронными (это все еще кстати) С тех пор я капитальным ремонт моего кода, чтобы заставить его работать в асинхронном режиме и удалить все jQuery (это проект Udacity и удаление jQuery было предложено инструктором).

Цените помощь

+0

Эти функции, которые вы вызываете «назад», являются * параметрами *. Тем не менее, вы никогда не пропускаете никаких аргументов! – Bergi

+0

Кроме того, вам нужно вызвать их из асинхронной части вашего кода (обработчик 'onreadystatechange'), а не только в конце функции! – Bergi

+0

Поскольку вы в зависимости от завершения запроса ajax, вы можете использовать функцию успеха в вызове ajax для выполнения других функций, которые зависят от этого, заканчивая первым. – lintmouse

ответ

0

у меня не хватает репутации положить комментарий, но дикая догадка, вы должны удалить аргумент в LoadData & getMarvelData или фактически передать функцию в вызовах этих функций.

0

Вы должны пройти параметры правильно. Попробуйте это:

var currentCharacter = {} 
loadData(getMarvelData, getGoogleMap); 

function loadData(f1, f2) { 
    // do sth. 
    f1(f2); 
} 

function getMarvelData(f2) { 
    // do sth. 
    f2(); 
} 

function getGoogleMap() { 
    // do sth. 
} 

Я havn't проверял, но он должен работать.

+0

Нет. У вас должен быть только один параметр обратного вызова. – Bergi

+0

А как вы называете третью функцию? – Max

+0

Выполняя 'loadData (function (data) {getMarvelData (data, getGoogleMap);})' – Bergi

Смежные вопросы