function fn_one() {
$('#search-city-form').trigger('click');
}
function fn_two() {
$("form input[name='tariffId']").val("137");
$('#search-city-form').trigger('click');
}
function fn_three() {
$("form input[name='tariffId']").val("138");
$('#search-city-form').trigger('click');
}
function fn_four() {
$("form input[name='tariffId']").val("139");
$('#search-city-form').trigger('click');
}
$(document).on('click','.ui-menu li',function(){
fn_one();
fn_two();
fn_three();
fn_four();
});
У меня есть этот код js. Мне нужно выполнить функции по порядку (щелкнуть), т.е. сначала идет fn_one(), потом fn_two() и т. д.
Приведите простой пример того, как я могу этого добиться.
Обновлено: ОК, я использовал следующую функцию для выполнения в предыдущей, но все же я получал ошибочные данные. Думаю, я понял, почему это происходит. Я объясню, что делает $('#search-city-form').trigger('click');. Он запускает отправку формы, которая вызывает вызов Ajax, а другие функции не ждут завершения запроса ajax. Итак, как мне заставить его ждать завершения запроса ajax?
Обновлено еще раз:
Обработчик событий для $('#search-city-form'):
$('#cdek').submit(function() {
var formData = form2js('cdek', '.', true, function(node) {
if (node.id && node.id.match(/callbackTest/)) {
return {
name : node.id,
value : node.innerHTML
};
}
});
var formDataJson = JSON.stringify(formData);
// console.info(JSON.stringify(formData));
document.getElementById('testArea').innerHTML = 'Отправляемые данные: <br />' + JSON.stringify(formData, null, '\t');
$.ajax({
url : 'http://api.cdek.ru/calculator/calculate_price_by_jsonp.php',
jsonp : 'callback',
data : {
"json" : formDataJson
},
type : 'GET',
dataType : "jsonp",
success : function(data) {
console.info(data.result.price);
} else {
for(var key in data["error"]) {
console.info(data["error"][key]);
}
}
}
});
return false;
});
Согласно этому коду они выполняются по порядку.
@messerbill нет, это делегирование событий на ui-menu li
Чтобы быть уверенным в порядке, вы можете выполнять функции как обратные вызовы. Таким образом, второй начнется только тогда, когда закончится первый и т. д.
Уже выполнен в порядке. Используйте следующую функцию, которая будет выполняться в предыдущей функции. Например. Позвоните в fn_two в конце fn_one(). SetTimeout, если вы хотите задержку вызова
@Ele и щелчок по элементу HTML (например, здесь <li>) - это не одновременный щелчок по document?
вы хотите временную задержку между звонками?
они в порядке. проверьте здесь> jsfiddle.net/q1ft25pn/39 посмотрите в консоли. Но вы можете вложить их, если хотите, как предлагали другие. @messerbill идея состоит в том, что он не работает так, как вы сначала предложили. Так, например, если есть еще один div, и щелкнуть по нему, он не вызовет щелчок по ui-menu li. Поэтому нажатие где угодно, кроме event delegation, работать не будет.
Что делает $('#search-city-form').trigger('click');? Если я хорошо понимаю, когда вы нажимаете на .ui-menu li, вы запускаете щелчок на $('#search-city-form'), затем меняете значение $("form input[name='tariffId']"), затем снова запускаете щелчок, снова меняете значение, запускаете щелчок, изменяете значение и снова запускаете щелчок?
Это совершенно неясно, пожалуйста, отправьте Минимальный, полный и проверяемый пример, чтобы немного лучше понять ваш сценарий.
хорошо, но, на мой взгляд, это все равно будет выполняться синхронно (потому что нигде в коде нет "асинхронных вызовов")
@messerbill да, ты прав.
что происходит, когда вы запускаете код как есть, вызывает ли он какие-либо ошибки или вы не видите, что функции выполняются в правильном порядке?
@messerbill, пожалуйста, посмотрите правку
@MickaelLeger, пожалуйста, проверьте правку.
@Ele, пожалуйста, проверьте правку.
Возможный дубликат Доступ к результату предыдущего обещания за секунду
пока мы говорим о звонках Ajax, это обман
Теперь все понятно!
1.) Можете поделиться обработчиком событий search-city-form. 2.) Почему вы запускаете этот процесс (вызов ajax) с помощью .trigger('click')?
@Ele 1) Пожалуйста, отметьте EDIT 2. 2) Я хочу имитировать отправку формы, в которой выполняется вызов ajax.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я сделаю это. Если вам нужно проверить, когда функция сработала, возможно, вам нужно поработать с обещаниями.
function fn_one() {
$('#search-city-form').trigger('click');
fn_two()
}
function fn_two() {
$("form input[name='tariffId']").val("137");
$('#search-city-form').trigger('click');
fn_three()
}
function fn_three() {
$("form input[name='tariffId']").val("138");
$('#search-city-form').trigger('click');
fn_four()
}
function fn_four() {
$("form input[name='tariffId']").val("139");
$('#search-city-form').trigger('click');
}
$(document).on('click','.ui-menu li',function(){
fn_one();
});
не закончится ли это бесконечным циклом из-за того, что на
documentесть обработчик кликов, который выполняет дальнейшие события кликов?