2014-05-01 3 views
0

У меня есть функция, которая хранит несколько значений из HTML-формы, и она должна работать индивидуально, чтобы хранить эту информацию в любой ситуации, в которой я нуждаюсь (т.е. перед вставкой в ​​БД или перед удалением информации о БД ...)Последовательность нескольких функций в jQuery

Мне нужно указать, что система должна выполнить эту функцию ('storeValues'), а затем выполнить любой другой (может быть 'createNewClass', 'updateExistingClass' ... что угодно).

Как это сделать? Я пытался здесь хранить значения первыми и, когда сделано, выполнить другую функцию aleting о стоимости, но он говорит: «storeValues ​​() не определен», и определяются:

$('.tableClassHeader').on('click', '.createClass', function(){ 
    storeValues().promise().done(function(){ 
     createNewClass(); 
    }); 
}); 

function storeValues(){ 
    cl_year = $('.newClassForm').find('select[name=cl_year]').val(); 
    cl_course = $('.newClassForm').find('select[name=cl_course]').val(); 
    } 

function createNewClass(){ 
    alert(cl_year);} 

Я имею в виду, что функция storeValues ​​СЛЕДУЕТ BE - отдельная функция с возможностью вызова из любого другого места, я знаю, что эту проблему можно решить, выполнив «createNewClass» из функции «storeValues», но будут моменты, когда мне нужно выполнить «updateClass» после «storeValues» ", а не" createNewClass "

+0

Когда вы говорите «может быть», вы основываете это на том, установлены ли значения или нет? – Johan

+0

Под этим я подразумеваю, что ДОЛЖЕН БЫТЬ отдельной функцией с возможностью вызова из любого другого места, я знаю, что эту проблему можно решить, выполнив «createNewClass» из функции «storeValues», но будут моменты, которые мне нужны выполнить «updateClass» после «storeValues», а не «createNewClass» – Biomehanika

+0

Во-первых, 'storeValues' не возвращает обещание. Хотя это не обязательно в вашем примере, поскольку вы не используете ничего асинхронного. – Johan

ответ

1

Вы можете использовать функцию обратного вызова, как это, если ваш storeValues не синхронизирован, как в вашем примере:

$('.tableClassHeader').on('click', '.createClass', function(){ 
    storeValues(createNewClass); 
}); 

function storeValues(callback){ 
    cl_year = $('.newClassForm').find('select[name=cl_year]').val(); 
    cl_course = $('.newClassForm').find('select[name=cl_course]').val(); 
    callback(); 
} 

function createNewClass(){ 
    alert(cl_year); 
} 

Если это синхронная, просто позвонить createNewClass после storeValues достаточно.

Что это делает:

  • предлагает Вам возможность пройти функцию выбора в storeValues
  • внутри storeValues она вызывает функцию обратного вызова, переданного в качестве параметра

Если вам нужно для выполнения вашей функции с другой областью вы можете использовать call или apply.


Другой способ сделать это, без обратных вызовов будет использовать

http://api.jquery.com/promise/
http://api.jquery.com/jQuery.when/
http://api.jquery.com/deferred.promise/

Пример, как показано здесь http://jsfiddle.net/47fXF/1/:

$('.tableClassHeader').on('click', '.createClass', function(){ 
    $.when(storeValues()).then(createNewClass); 
}); 

function storeValues(){ 
    var dfd = new jQuery.Deferred(); 
    setTimeout(function(){ 
     console.log('storing values'); 
     cl_year = $('.newClassForm').find('select[name=cl_year]').val(); 
     cl_course = $('.newClassForm').find('select[name=cl_course]').val(); 
     dfd.resolve(); 
    }, 1000); 

    return dfd.promise(); 
} 

function createNewClass(){ 
    alert("trololo"); 
} 

Добавлена ​​setTimeout для имитации асинхронности.

Если ваш storeValues выполняет только один запрос ajax с использованием jQuery, вы можете вернуть его напрямую, как показано в документации API.

Также не забудьте позвонить по телефону resolve(), reject() надлежащим образом.

+0

Я собираюсь попробовать, Ill скажу вам тогда. Спасибо. – Biomehanika

+1

Нет необходимости использовать обратный вызов для синхронного выполнения. Это анти-шаблон. – Johan

+0

@ Johan из того, что я понял, 'storeValues' не является синхронным. Имя предполагает асинхронную операцию, и когда это будет сделано, она должна вызывать следующую функцию. – Andrei

0

Звоните так. он первым называют storeValues ​​после выполняет функцию createNewClass

$('.tableClassHeader').on('click', '.createClass', function(){ 

    storeValues(function() { 
     createNewClass(); 
    }); 

}); 

function storeValues(callback){ 
    cl_year = $('.newClassForm').find('select[name=cl_year]').val(); 
    cl_course = $('.newClassForm').find('select[name=cl_course]').val(); 
    callback(); 
} 
+0

Значение самого элемента select содержит правильное значение. Зачем ему нужно настроить таргетинг на выбранный вариант? – Johan

+0

спасибо, в любом случае .val() всегда был прав для меня, он сохраняет атрибут value из выбранного параметра – Biomehanika

+0

Благодарим за внимание. Я пробовал называть способ, который вы объясняете, и он просто ничего не делает: предупреждение не отображается, и на firebug не отображается ошибка ... – Biomehanika

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