javascript - examples - jquery.noconflict() example
jQuery: espere a que la funciĆ³n se complete para continuar con el procesamiento? (9)
Ajax ya te da una devolución de llamada, se supone que debes usarla:
function dostuff( data ) {
for(var i = 0; i < data.length; i++) {
// Do stuff with data
}
};
$(document).ready( function() {
$.getJSON( "/controller/method/", null, dostuff );
});
Oigan todos. Tengo, lo que parece ser, un problema trivial. Tengo el siguiente JavaScript:
$(function() {
var r = GetResults();
for(var i = 0; i < r.length; i++) {
// Do stuff with r
}
});
function GetResults() {
$.getJSON("/controller/method/", null, function(data) {
return data;
});
}
Debido al hecho de que estoy llamando a un método de forma asíncrona, la secuencia de comandos continúa ejecutándose y cuando encuentra el bucle for, r
obviamente no tendrá un valor todavía. Mi pregunta es: cuando tengo un método que está realizando una operación asíncrona y dependo de los datos que devuelve en el bloque principal, ¿cómo detengo la ejecución hasta que se devuelven los datos? Algo como:
var r = GetResults(param, function() {
});
donde la función es una función de devolución de llamada. No puedo mover el procesamiento de bucle for a la función de devolución de llamada de la solicitud JSON porque estoy reutilizando la funcionalidad de GetResults varias veces a lo largo de la página, a menos que quiera duplicar el código. ¿Algunas ideas?
Esto no es posible.
O hace que su función sea sincrónica o cambia el diseño de su código para que sea compatible con la operación asíncrona.
La respuesta corta es que no se puede bloquear en una operación asíncrona ... que es, por supuesto, el significado de "asíncrono".
En su lugar, debe cambiar su código para utilizar una devolución de llamada para desencadenar la acción en función de los datos devueltos de la $.getJSON(...)
. Algo como lo siguiente debería funcionar:
$(function() {
GetResults();
});
function GetResults() {
$.getJSON("/controller/method/", null, function(data) {
for(var i = 0; i < data.length; i++) {
// Do stuff with data
}
});
}
Me he encontrado con algo similar antes. Tendrás que ejecutar la llamada ajax de forma síncrona.
Aquí está mi ejemplo de trabajo:
$.ajax({
type: "POST",
url: "/services/GetResources",
contentType: "application/json; charset=utf-8",
dataType: "json",
data: ''{resourceFileName:"mapedit",culture:"'' + $("#lang-name").val() + ''"}'',
cache: true,
async: false, // to set local variable
success: function(data) {
localizations = data.d;
}
});
Mueva el procesamiento de datos a la devolución de llamada:
$(function() {
GetResults();
});
function GetResults() {
$.getJSON("/controller/method/", null, function(data) {
for(var i = 0; i < data.length; i++) {
// Do stuff with data
}
});
}
Podrías hacer esto:
$(function() {
PerformCall();
});
function PerformCall() {
$.getJSON("/controller/method/", null, function(data) {
for(var i = 0; i < data.length; i++) {
// Do stuff with data
}
});
}
Puede tener una devolución de llamada con parámetros que deberían funcionar bien ...
$(function() {
GetResults(function(data) {
for(var i = 0; i < data.length; i++) {
// Do stuff with data
}
});
});
function GetResults(func) {
$.getJSON("/controller/method/", null, func);
}
Teniendo en cuenta sus requisitos actualizados ...
No puedo mover el procesamiento de bucle for a la función de devolución de llamada de la solicitud JSON porque estoy reutilizando la funcionalidad de GetResults varias veces a lo largo de la página, a menos que quiera duplicar el código. ¿Algunas ideas?
... podría modificar GetResults()
para aceptar una función como parámetro, que luego ejecutaría como su devolución de llamada $.getJSON
(advertencia de código de aire):
$(function() {
GetResults(function(data) {
for(var i = 0; i < data.length; i++) {
// Do stuff with data
}
});
});
function GetResults(callback) {
$.getJSON("/controller/method/", null, callback);
}
Como puede ver en la marea general de respuestas, es mejor que no intente luchar contra el modelo de programación jQuery asíncrono. :)
mueva su bloque "haga cosas con r" a su devolución de llamada $ .getJSON. no puede hacer cosas con r hasta que se haya entregado, y la primera oportunidad que tendrá que usar r está en la devolución de llamada ... hágalo entonces.
$(function() {
var r = GetResults();
});
function GetResults() {
$.getJSON("/controller/method/", null, function(data) {
for(var i = 0; i < data.length; i++) {
// Do stuff with data
}
return data;
});
}