В каком порядке DOJO обрабатывает ajax-запросы? - PullRequest
2 голосов
/ 11 мая 2010

Использование формы в диалоговом окне Я использую Dojo в jsp для сохранения формы в моей базе данных. После того, как этот запрос завершен с помощью dojo.xhrPost (), я отправляю другой запрос на обновление выпадающего списка, который должен включать добавленный объект формы, который был только что сохранен, но по какой-то причине запрос на обновление выпадающего списка выполняется перед сохранением формы в базе данных, даже если сначала вызывается форма save. Используя Firebug, я вижу, что запрос getLocations () завершен до запроса sendForm (). Это код:

<button type="button" id="submitAddTeamButton" dojoType="dijit.form.Button">Add Team
                    <script type="dojo/method" event="onClick" args="evt">

                        sendForm("ajaxResult1", "addTeamForm");
                        dijit.byId("addTeamDialog").hide();
                        getLocations("locationsTeam");
                    </script>

function sendForm(target, form){
    var targetNode =  dojo.byId(target);

    var xhrArgs = {
        form: form,
        url: "ajax",
        handleAs: "text",
        load: function(data) {

            targetNode.innerHTML = data;
        },
        error: function(error) {
            targetNode.innerHTML = "An unexpected error occurred: " + error;
        }

    }

    //Call the asynchronous xhrGet
    var deferred = dojo.xhrPost(xhrArgs);
}

function getLocations(id) {
    var targetNode =  dojo.byId(id);

    var xhrArgs = {
        url: "ajax",
        handleAs: "text",
        content: {
            location: "yes"
        },
        load: function(data) {

            targetNode.innerHTML = data;
        },
        error: function(error) {
            targetNode.innerHTML = "An unexpected error occurred: " + error;
        }
    }

    //Call the asynchronous xhrGet
    var deferred = dojo.xhrGet(xhrArgs);
}

Почему это происходит? Есть ли способ сделать первый запрос первым, прежде чем будет выполнен второй?

Чтобы уменьшить вероятность того, что это происходит, я попытался установить для свойства cache в xhrGet значение false, но результат все тот же.

Пожалуйста, помогите!

Ответы [ 2 ]

4 голосов
/ 11 мая 2010

Как сказал Алекс, асинхронные запросы - только это - их порядок не гарантирован.Если вы хотите гарантировать их заказ, вы можете сделать их синхронными, если хотите.Есть опция sync: true Я думаю, что вы можете отправить с запросом args.Это приводит к тому, что браузер замораживает до тех пор, пока запрос не вернется, поэтому он не рекомендуется, если у вас нет другого выбора, и запрос очень быстрый.

Вы также можете отправить любые данные, которые вынужно вместе с данными текущего запроса.Например, предположим, что значение раскрывающегося списка A определяет варианты списка, доступные в раскрывающемся списке B. Вместо того, чтобы отправлять изменения при изменении раскрывающегося списка A, затем обновлять варианты выбора раскрывающегося списка B, что вы можете сделать, это передать значение A в момент открытия раскрывающегося списка Bи обработать его в логике сервера, которая определяет выбор Б.(Предполагается, что у вас есть раскрывающийся виджет с вариантами, созданными сервером, а не стандартным тегом.)

3 голосов
/ 11 мая 2010

Первый A в Ajax означает «асинхронный», что означает, что все происходит «в своем собственном темпе»: скорее всего, запросы отправляются в ожидаемом порядке, но они завершены наоборот просто потому, что второй быстрее. Да, конечно, вы можете подождать даже start (отправить) второй запрос до тех пор, пока не завершится первый - проще всего, вы можете просто поместить запуск второго запроса в функцию обратного вызова первого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...