Это обсуждается на нескольких других потоках здесь в настоящее время. Я - последовательный сторонник хранимых процедур, хотя некоторые хорошие аргументы для Linq к Sql представляются.
запросы Встраивания в Вашем коде связывает Вас плотно с Вашей моделью данных. Хранимые процедуры являются хорошей формой договорного программирования, означая, что DBA имеет свободу изменить модель данных и код в процедуре, пока контракт, представленный вводами и выводами хранимой процедуры, сохраняется.
Настраивающиеся производственные базы данных могут быть чрезвычайно трудными, когда запросы прокладываются под землей в коде а не в одном центральном, легком для управления местоположением.
[Редактирование] Здесь другой текущее обсуждение
Один из вариантов - иметь переменную, которая показывает текущее состояние, и иметь функцию «контроллер», которая всегда является функцией обратного вызова AJAX. В зависимости от текущего состояния функция контроллера вызовет следующую функцию в строке. Чтобы упростить функцию контроллера, я бы, вероятно, сохранил последовательность функций для вызова в объекте Javascript, поэтому все, что выполняет функция контроллера, - это поиск и переход к следующей функции в последовательности. Этому подходу может способствовать наличие одного объекта Javascript, который всегда является параметром функции (и содержит все данные, которые были возвращены предыдущими вызовами AJAX.
Пример:
var user = {};
var currentState = 1;
var someFunction = function(user) {//stuff here that adds data to user via AJAX, advances currentState, and calls controllerFunction as callback};
var someOtherFunction = function(user) {//stuff here that does other things to user, advances currentState, and calls controllerFunction as callback}
var functionSequence = {1:someFunction, 2:someOtherFunction}
var controllerFunction = function() {
//retrieve function from functionSequence based on current state, and call it with user as parameter
}
Вы можете контролировать этот вид спагетти с помощью таких вещей, как шаблон Наблюдатель . В некоторых фреймворках JavaScript есть готовые к использованию реализации этой функции, например, функции публикации / подписки Dojo .
Если вы хотите, чтобы ваши функции могли работать независимо, снабдите асинхронные функции общими обратными вызовами вместо вызовов "следующей" функции в строке. Затем, как сказал JacobM, настройте «контроллер», который будет вызывать их по очереди. Я изменил ваш пример кода ниже, чтобы продемонстрировать (будьте осторожны, это не было протестировано):
gadgets.util.registerOnLoadHandler(userSetupController())
...
function setupUser(callback) {
var req = [get data and setup request]
req.send(some_url, some_data, function(response) { callback(response.user) });
}
function getFriendsFor(user,callback) {
var friends = [get friends from user]
var req = [setup request]
req.send(some_other_url, some_other_data, function(response { callback(response.friends) });
}
function validateFriendsResponse(friends) {
if (friends.valid())
return true;
else
return false;
}
function userSetupController() {
setupUser(function(user){
getFriendsFor(user,function(friends){
if (validateFriendsResponse(friends)) {
loadCanvas();
} else {
// don't load the canvas?
}
});
});
}
Создание обратных вызовов становится немного сложным, если вы с ними не знакомы - вот достойное объяснение: http: / /pixelpushing.net/2009/04/anonymous-function-callbacks/. Если вы хотите усложнить задачу (опять же, как предложил JacobM), вы можете написать код, который обрабатывает это автоматически - дайте ему список функций, и он выполняет их по порядку, передавая данные обратного вызова. Удобно, но может оказаться излишним для ваших нужд.
Отчасти проблема в том, что вы думаете об этом как о четырехэтапном процессе с тремя циклами обращения к серверу. обязательный. Если вы действительно думаете, что это единый рабочий процесс, и то, что пользователь, скорее всего, сделает, то лучшее ускорение - собрать как можно больше информации при первом взаимодействии, чтобы уменьшить количество обращений. Это может включать разрешение пользователю установить флажок, в котором говорится, что он хочет следовать по этому пути, чтобы вам не приходилось возвращаться к пользователю между шагами, или разрешение ему вводить предположение об именах друзей, которое вы можете обработать в первый раз или предварительно загружая список имен в первый раз.
То, как вы обрисовали код, работает лучше всего, если это лишь один из многих путей, по которым может следовать пользователь; требуется несколько циклов туда и обратно, потому что при каждом взаимодействии вы узнаете, чего хочет пользователь, и другой ответ отправил бы вас в другом направлении. Это когда действительно проявляется слабосвязанный стиль кода, который вы пренебрегаете. Похоже, что каждый шаг не связан с тем, что было раньше, потому что действия пользователя управляют действиями.
Итак, реальный вопрос заключается в том, есть ли у пользователя выбор в начале, который определяет направление движения вашего кода. Если нет, то вы хотите оптимизировать путь, который, как вы знаете (или строго прогнозируете), будет происходить во взаимодействии. С другой стороны, если взаимодействие пользователя управляет процессом, то разделение этапов и реакция на каждое взаимодействие - это правильно, но вы ожидаете гораздо больше различных возможностей.
Вы узнаете, что хочет пользователь, и другой ответ отправил бы вас в другом направлении. Это когда действительно проявляется слабосвязанный стиль кода, который вы презираете. Похоже, что каждый шаг не связан с тем, что было раньше, потому что действия пользователя управляют активностью.Итак, реальный вопрос заключается в том, есть ли у пользователя выбор в начале, который определяет направление движения вашего кода. Если нет, то вы хотите оптимизировать путь, который, как вы знаете (или строго прогнозируете), будет происходить при взаимодействии. С другой стороны, если взаимодействие пользователя управляет процессом, то разделение этапов и реакция на каждое взаимодействие - это правильно, но вы ожидаете гораздо больше различных возможностей.
Вы узнаете, что хочет пользователь, и другой ответ отправил бы вас в другом направлении. Это когда действительно проявляется слабосвязанный стиль кода, который вы пренебрегаете. Похоже, что каждый шаг не связан с тем, что было раньше, потому что действия пользователя управляют действиями.Итак, реальный вопрос заключается в том, есть ли у пользователя выбор в начале, который определяет направление движения вашего кода. Если нет, то вы хотите оптимизировать путь, который, как вы знаете (или строго прогнозируете), будет происходить при взаимодействии. С другой стороны, если взаимодействие пользователя управляет процессом, то разделение этапов и реакция на каждое взаимодействие - это правильно, но вы ожидаете гораздо больше различных возможностей.
Это когда действительно проявляется слабосвязанный стиль кода, который вы презираете. Похоже, что каждый шаг не связан с тем, что было раньше, потому что действия пользователя управляют активностью.Итак, реальный вопрос заключается в том, есть ли у пользователя выбор в начале, который определяет направление движения вашего кода. Если нет, то вы хотите оптимизировать путь, который, как вы знаете (или строго прогнозируете), будет происходить при взаимодействии. С другой стороны, если взаимодействие пользователя управляет процессом, то разделение этапов и реакция на каждое взаимодействие - это правильно, но вы ожидаете гораздо больше различных возможностей.
Это когда действительно проявляется слабосвязанный стиль кода, который вы пренебрегаете. Похоже, что каждый шаг не связан с тем, что было раньше, потому что действия пользователя управляют активностью.Итак, реальный вопрос заключается в том, есть ли у пользователя выбор в начале, который определяет направление движения вашего кода. Если нет, то вы хотите оптимизировать путь, который, как вы знаете (или строго прогнозируете), будет происходить при взаимодействии. С другой стороны, если взаимодействие пользователя управляет процессом, то разделение этапов и реакция на каждое взаимодействие - это правильно, но вы ожидаете гораздо больше различных возможностей.
реальный вопрос заключается в том, есть ли у пользователя выбор в начале, определяющий направление развития вашего кода. Если нет, то вы хотите оптимизировать путь, который, как вы знаете (или строго прогнозируете), будет происходить при взаимодействии. С другой стороны, если взаимодействие пользователя управляет процессом, то разделение этапов и реакция на каждое взаимодействие - это правильно, но вы ожидаете гораздо больше различных возможностей. реальный вопрос заключается в том, есть ли у пользователя возможность выбора с самого начала, определяющая направление развития вашего кода. Если нет, то вы хотите оптимизировать путь, который, как вы знаете (или строго прогнозируете), будет происходить во взаимодействии. С другой стороны, если взаимодействие пользователя управляет процессом, то разделение этапов и реакция на каждое взаимодействие - это правильно, но вы ожидаете гораздо больше различных возможностей.Код для обработки функций отображения, скрытия и состояния должен быть извлечен в функции. Затем, чтобы избежать "спагетти", можно использовать встроенные анонимные функции.
function setupUser() {
var req = [get data and setup request]
req.send(some_url, some_data, function(response) {
var friends = [get friends from user]
var req = [setup request]
req.send(some_other_url, some_other_data, function(response {
if (friends.valid())
...
loadCanvas();
});
});
}
Создайте свой клиент javascript с архитектурой MVC
Backbone (documentcloud.github.com/backbone)
Spine (spinejs .com)
JavascriptMVC - http://www.javascriptmvc.com/
SproutCore - http://www.sproutcore.com/
Jamal - http: / /jamal-mvc.com/[12115 impressionTrimJunciton - http://code.google.com/p/trimpath/wiki/TrimJunction
Trimpath - http://code.google.com/ p / trimpath /