Cómo devolver una cadena de una llamada ajax

Gracias por el A2A …

Basado en lo que creo que estás tratando de hacer, aquí están mis recomendaciones basadas en el supuesto de que estás usando jQuery. Tenga en cuenta que esta es una respuesta larga con múltiples ejemplos que logran lo mismo , ya que jQuery le brinda muchas maneras de desollar a un gato.

Este primer enfoque es básicamente un refactorizador del código al que se vinculó. No puede simplemente devolver datos de la función de devolución de llamada success () . En su lugar, debe hacer algo como esto usando una var global :

$ .ajax ({
url: ‘xxx.json’, // Esta debe ser una ruta relativa (es decir, ../path/to/xxx.json) o una ruta absoluta (es decir, http://host.com/path/to/xxx.json)
tipo: ‘OBTENER’,
dataType: ‘json’,
éxito: función (config) {
// Haga algo con config.version en lugar de regresar.
// Si necesitas que config.version sea accesible desde cualquier lugar
// en tu código, deberás repetir esta lógica
// donde sea que lo necesite, o defina una variable global,
// como window.global.version. Esta variable global
// será accesible desde cualquier parte de su código, y usted
// puede considerar configurar esto desde el principio
// con tu lógica init / bootstrap.

window.global.version = config.version;

// o simplemente almacena el objeto de respuesta completo …
window.config = config;
}
});

NOTA: No necesita la propiedad de datos como tenía en su código de muestra ya que solo está leyendo datos estáticos del archivo JSON.

Un atajo para $ .ajax () es $ .get () . Como solo está haciendo una solicitud GET a un archivo estático, puede usar $ .get () para realizar exactamente la misma llamada AJAX, de la siguiente manera:

$ .get ({
url: ‘xxx.json’,
dataType: ‘json’,
éxito: función (config) {
// Los mismos comentarios que arriba
}
});

O un camino más corto …

$ .get (‘xxx.json’, función (config) {
// Los mismos comentarios que arriba. Esto es solo un atajo para
// * éxito * devolución de llamada en la firma $ .get ().
}, ‘json’);

O incluso más corto pero usando Diferido / Promesas …

NOTA: El ejemplo de Evan es un poco redundante porque en jQuery, la función $ .ajax () y todas sus derivadas ya devuelven una Promesa. No es necesario instanciar un nuevo $ .Deferred (); objetar con este ejemplo, pero hay casos de uso válidos para hacerlo. Lo que estás tratando de lograr no lo necesita.

$ .get (‘xxx.json’, function () {}, ‘json’). success (function (config) {
// Los mismos comentarios que arriba, pero aprovechando jQuery’s Deferred / Promise.
});

// O …

$ .get (‘xxx.json’, function () {}, ‘json’). done (function (config) {
// Igual que el anterior, usando la devolución de llamada * done () *
});

O de manera similar, al pasar un objeto a $ .get () …

$ .get ({
url: ‘xxx.json’,
dataType: ‘json’
}). done (function (config) {
// O la otra forma de usar $ .get ()
});

Tenga en cuenta que cualquiera de los anteriores podría incluirse en una función como getVersion () , getConfig () , etc. si lo desea. Por ejemplo, si no desea utilizar una var global como mencioné anteriormente , puede manejar la Promesa que devuelve $ .ajax () o $ .get () en una función global:

función getConfig () {
return $ .get ({
url: ‘xxx.json’,
dataType: ‘json’
});
}

// …

getConfig (). done (function (config) {
if (config.version> = 1) {
// Hacer algo
}
});

// … luego en otro lugar de tu código

getConfig (). done (function (config) {
if (config.my_other_config_setting! = blah) {
// Hacer algo más
}
});

O también puede usar la devolución de llamada success () si lo prefiere en lugar de done () .

getConfig (). success (function (config) {
if (config.version> = 1) {
// Hacer algo
}
});

NOTA: success () regresa antes de terminar (). Entonces podría encadenar su lógica de la siguiente manera:

getConfig (). success (function (config) {
if (config.version> = 1) {
// Hacer algo
}
}). done (function (config) {
if (config.foo == bar) {
// Hacer algo más.
}
});

Espero haber sido claro en mis ejemplos. Si tienes mas preguntas, solo pregunta. Hay otras cosas que podría hacer para hacer esto aún más robusto … pero creo que eso irá más allá del alcance de lo que está tratando de lograr.

Ajax es asíncrono, lo que significa que el código dentro de su función de éxito ocurre en algún momento en el futuro. Sin embargo, el proceso de JavaScript no solo se queda allí esperando, sino que continúa con cualquier código que escriba después de llamar a su función de prueba . En su lugar, debe escribir cualquier código que necesite acceso a la versión dentro de la devolución de llamada correcta. De lo contrario, puede usar Promesas u otra estructura para envolver la devolución de llamada en azúcar sintáctico.

[Editar]: después de aclarar la pregunta en un comentario, aquí hay una solución a lo que creo que quieres hacer. (Esto es una especie de 2 soluciones, con la asíncrona una más correcta)

// mantener algún estado en una variable

estado var = {

versión: nulo

};

var versionPromise = prueba (estado);

prueba de función (estado) {

$ .ajax {…, éxito: función (resp) {

state.version = resp.version;

});

}

función getVersion () {

return state.version;

}

Debe esperar para llamar a getVersion hasta que vuelva la respuesta. De lo contrario, deberá hacer que getVersion () sea asíncrono y devolver una promesa o recibir una devolución de llamada como:

// mantener referencia a promesa en una variable

var versionPromise = test ();

prueba de funcionamiento(){

var dfd = new $ .Deferred ();

$ .ajax {…, éxito: función (resp) {

dfd.resolve (resp.version);

});

return dfd.promise ();

}

función getVersionAsync () {

versión de retorno Promesa;

}

// Entonces lo llamarías así:

getVersionAsync (). then (function (version) {

// usa la versión aquí

});

En la llamada AJAX básicamente llamará a una función de un lenguaje del lado del servidor como C #. Entonces esa función puede devolver alguna cadena, y esto se enviará a la llamada ajax como respuesta ajax

Vea este tutorial cuando una llamada ajax está llamando a una función C # que a su vez está devolviendo una cadena – Ejemplo de jQuery AJAX – Llamando a una función C # con jQuery AJAX [Con código]

Hola,

El problema con su código es que $ .ajax es asíncrono. La respuesta del servidor puede venir antes o después de la devolución. Para que esto funcione, haga que su llamada ajax sea síncrona:

prueba de funcionamiento() {
var xhr = $ .ajax ({
url: ‘xxx.json’,
tipo: ‘OBTENER’,
dataType: ‘json’,
datos: {},
asíncrono: falso
});

return JSON.parse (xhr.responseText) .version;
}

var x = prueba ();

Espero que sea útil.