Я нахожу, что пишу много спагетти в Javascript, когда мне приходится иметь дело с асинхронными приложений (особенно при работе с кодом OpenSocial, где все данные должны быть получены через JS). Обычный шаблон выглядит примерно так:
- Пользователь регистрируется в приложении в первый раз, получает свои данные.
- Сделайте A на своих данных (например, получите друзей, отправив запрос на сервер).
- Сделайте B по этим данным (например, отправьте своих друзей на сервер для некоторой обработки).
- Сделайте C на своих данных (например, проверьте, что ответ сервера действителен, поэтому мы можем сделать что-то еще).
Обратите внимание, что этот последовательный путь выполнения (1 = > 2 = > 3 = > 4) не соответствует хорошо асинхронному. природа Ajax, поэтому пользователь заканчивает ожидание долгое время, и код превращается в беспорядок с каждого шага зависит от предыдущих.
Пример с кодом:
gadgets.util.registerOnLoadHandler(setupUser())
...
function setupUser() {
var req = [get data and setup request]
req.send(some_url, some_data, function(response) { getFriendsFor(response.user) });
}
function getFriendsFor(user) {
var friends = [get friends from user]
var req = [setup request]
req.send(some_other_url, some_other_data, function(response { validateFriendsResponse(response.friends) });
}
function validateFriendsResponse(friends) {
if (friends.valid())
...
loadCanvas();
}
Вы можете видеть, что каждая функция зависит от предыдущей, и что еще хуже, ее нужно вызвать в конкретный порядок, который будет полезен. Ухудшается, когда вам приходится добавлять такие вещи, как показ/скрытие загрузки экраны и другие трюки, пока пользователь ждет.
Как вы можете это исправить?