@Partizanin
Java Developer

Как выполнить одну функцию javasript после другой?

Есть функция "changedListener" внутри которой вызывается еще 2 "changContent" и "count" !
Проблема в том что после того как я вызываю функцию "changContent" после ее выполнения должна выполниться функция "count" но когда я все это дебажил то увидел что функция "count" вызывается не после функции "changContent" а вовремя!
Функция "changContent" не успевает выполнится до конца и во время ее выполнения сразу вызывается следующая функция "count" и получается что контент еще не успел измениться как функция "count" уже что-то считает!
Подскажите как можно исправить это недоразумение !

function callToServer(request) {
    var myData = {"operationCall": request};
    var defer = $.Deferred();
    $.ajax({
        type: "GET",
        url: "/ConventerServlet",
        data: {jsonData: JSON.stringify(myData)},
        dataType: "json",

        //if received a response from the server
        success: function (jsonData) {

        },

        error: function (jqXHR, textStatus, errorThrown) {
            console.log(textStatus, errorThrown);
        },

        complete: function () {

        }

    }).done(function (data) {
        defer.resolve(data);
    }).fail(function (xhr, status, errorThrown) {
        alert("Sorry, there was a problem!");
        console.log("Error: " + errorThrown);
        console.log("Status: " + status);
        console.dir(xhr);
    });
    return defer.promise();
}

function changedListener(object) {

    if (object.type == "select-one") {

        console.log("ChangeListener:" + object.value);

        changContent(object.value, "default", "changeCourse");

        count();

    } else if (object.type == "button") {

        console.log("ChangeListener:" + object.id);


        changContent($("#selectExchange").val(), object.id, "changeOperation");


        buttonOperation(object.id, "disabled");


    } else if (object.type == "text") {

        validation();

    }

    function validation() {

        var booll = ""/*parserFloat()*/;

        var input = document.getElementById("inputValue"),
            inputButton = document.getElementById("inputButton");

        if (!input.checkValidity()) {

            inputButton.click();

            booll = false;
        } else {
            booll = true;
        }

        if (booll) {
            count();
        } else {
            /* setDefaultValues();*/
        }

        /*changeIcon(booll); dont work*/

        return booll;

    }

}
  • Вопрос задан
  • 4020 просмотров
Решения вопроса 1
Petroveg
@Petroveg
Миром правят маленькие с#@&ки
Для вызова после исполнения асинхронного кода придуман конструктор Promise.
В jQuery с целью кроссбраузерной реализации существует объект Deffered.

function one (request) {
	var defer = $/Deferred();

	$.ajax({
		...
	}).done(function (data) {
		defer.resolve(data);
	}).done(function () {
		defer.resolve();
	});
	return defer.promise();
}

one.then(function (data) {
	if (data) {
		//Запрос успешен
	} else {
		//Запрос провален
	}
});
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Jeiwan
@Jeiwan
Передавать count в качестве коллбэка в changeContent и вызывать её там по завершении. В changeContent, по видимому, что-то асинхронное происходит.
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Несмотря на то, что функции изменения страницы (.append, .html и т.д.) выполняются синхронно, само изменение DOM-модели в webkit-браузерах является асинхронной операцией. Самый простой способ обхода - задержка перед count() или использование setInterval().
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы