как бороться с асинхронными вызовами в Ajax 4.0 (используя jquery?) - PullRequest
0 голосов
/ 27 января 2010

в моем коде я сделал что-то вроде этого.

 $.get('/Home/Module/Submit',
                { moduleName: ModName,
                    moduleParameters: moduleParameters
                },

   function(result) {


       $("#" + target).html(result);

   });

когда я включаю предупреждение в функцию (результат) {..} он показывает html отлично (как в оповещении, так и в 'target' на странице .aspx) НО, когда я удаляю предупреждение .. на странице «html» не появляется или появляется случайно (этот метод вызывается несколько раз)

я думаю, что «результат» работает асинхронно, поэтому он не связан с соответствующим «div» однако в последней итерации он связывается каждый раз.

мы можем остановить процесс, пока данные не будут связаны? или есть какая-либо функциональность (например, оповещение), которая может связывать данные. без нарушения пользовательского интерфейса (в отличие от оповещения)?

1 Ответ

0 голосов
/ 27 января 2010

Ваша функция обратного вызова использует target, который определен вне области, возможно, глобальной. Вы говорите, что делаете этот вызов несколько раз, и что последняя итерация работает каждый раз, поэтому я предполагаю, что target фактически изменяется каким-то внешним влиянием? В этом случае вполне может оказаться, что значение target не является тем, что вы думаете, во время выполнения. Вы можете создать новое замыкание, в котором target не изменится:

$.get('/Home/Module/Submit', { data }, (function(t) {
    return function(result) {
        $("#" + t).html(result);
    }
})(target));

Здесь мы создаем новую анонимную функцию, которая возвращает функцию обратного вызова, которую вы хотите использовать. Вы можете думать об этом как о заводской функции. Эта функция вызывается немедленно, всего за до вызова get, так как она должна быть оценена, чтобы определить третий параметр для передачи get. Мы вызываем эту функцию, передавая target, поэтому значение target будет значением, которое она имеет к моменту вызова AJAX, а не, как раньше, ко времени ответа AJAX. Для каждой итерации будет создано новое замыкание, где соответствующий параметр t будет соответствовать значению target во время его создания.

Вы не хотите придумать что-то, что будет препятствовать выполнению JavaScript до тех пор, пока не будет выполнен какой-то другой фрагмент кода.

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