2010-10-15 23 views
28

Tengo una función js, después de hacer algunas lógica de negocio, la función JavaScript debe devolver un resultado a otro código variable.Sample continuaciónasignar el valor devuelto por una función de alguna variable usando javascript

var response=""; 
function doSomething() { 
    $.ajax({ 
     url:'action.php', 
     type: "POST", 
     data: dataString, 
     success: function (txtBack) { 
      if(txtBack==1) { 
       status=1; 
      } 
    }); 
    return status;  
} 

Aquí quiero usar como

response=doSomething(); 

quiero asignar un valor de retorno "status" "respuesta var" .Pero el resultado es 'indefinido' Por favor me ayude a solucionar este problema.

Gracias de antemano.

+0

Ya aparece la fraseología correcta en su título: * return value *. Pero no está utilizando 'return' en su función;) –

+0

Tenga en cuenta que generalmente no necesita inicializar nuevas variables con valores si esos valores son falsos (lo cual es una cadena vacía). Simplemente puede escribir: respuesta var; El valor de respuesta se establecerá en el valor indefinido en este caso (que también es un valor falso).Luego, cuando quieras verificar si el valor ha sido establecido, puedes verificar si es falso o no ... –

+0

@Felix: tengo una llamada ajax dentro de la función, está regresando "indefinido". ¿alguna idea? Gracias –

Respuesta

6

simplemente puede devolver un valor de la función:

var response = 0; 

function doSomething() { 
    // some code 
    return 10; 
} 
response = doSomething(); 
+0

Está funcionando ... pero tengo una llamada jaja adentro, en ese momento el resultado es 'indefinido'. ¿Alguna idea? Por favor mira el código de muestra modificado. –

48

O simplemente ...

var response = (function() { 
    var a; 
    // calculate a 
    return a; 
})(); 

En este caso, la variable de respuesta recibe el valor de retorno de la función. La función se ejecuta inmediatamente.

Puede usar esta construcción si desea llenar una variable con un valor que necesita calcularse. Tenga en cuenta que todos los cálculos ocurren dentro de la función anónima, por lo que no contamina el espacio de nombres global.

+0

Para los curiosos, esto se llama una * función invocada inmediatamente express * (IIFE). Y es asombroso. – Scribblemacher

+0

Tenga en cuenta que la función en sí está entre paréntesis (hay un paréntesis de apertura antes de la palabra 'función') y que hay un'() 'adicional al final. (No fue obvio para mí a primera vista) – J0ANMM

14

Las solicitudes AJAX son asincrónicas. Se está ejecutando su función doSomething, se realiza la solicitud AJAX pero ocurre de forma asíncrona; por lo que el resto de doSomething se ejecuta y el valor de status no está definido cuando se devuelve.

Efectivamente, el código funciona de la siguiente manera:

function doSomething(someargums) { 
    return status; 
} 

var response = doSomething(); 

Y luego un poco más tarde, su petición AJAX es completar; pero ya es demasiado tarde

Necesita modificar su código y rellenar la variable "respuesta" en la devolución de llamada "exitosa" de su solicitud AJAX. Tendrá que retrasar el uso de la respuesta hasta que se complete la llamada AJAX.

Donde previamente puede haber tenido

var response = doSomething(); 

alert(response); 

que debe hacer:

function doSomething() { 
    $.ajax({ 
      url:'action.php', 
      type: "POST", 
      data: dataString, 
      success: function (txtBack) { 
      alert(txtBack); 
      }) 
    }); 
}; 
1

La única manera de recuperar el valor correcto en su contexto es ejecutar $.ajax() función de forma sincrónica (lo que en realidad contradice a idea principal de AJAX). Existe el atributo de configuración especial async que debe establecer en false. En ese caso, el alcance principal que en realidad contiene la llamada a la función $.ajax() se pausa hasta que se realiza la función síncrona, por lo tanto, se llama al return solo después de .

function doSomething() { 
    var status = 0; 
    $.ajax({ 
     url: 'action.php', 
     type: 'POST', 
     data: dataString, 
     async: false, 
     success: function (txtBack) { 
      if (txtBack == 1) 
       status = 1; 
     } 
    }); 

    return status; 
} 

var response = doSomething(); 
Cuestiones relacionadas