2010-05-04 27 views
10

Hola Estoy tratando de manejar una respuesta JSON ajaxJavascript interruptor (verdadero)

aquí es mi código

success: function (j) {  
    switch(true) 
    { 
     case (j.choice1): 

      alert("choice2"); 
     break; 
     case (j.choice2): 
       alert("choice2"); 
     break; 
     default: 
      alert("default"); 
     break; 
    } 
} 

basado en lo que j es volver hago mi acción pero aparece el valor predeterminado.

He alertado los valores de j y vengo correcto. Algunos casos (j.choice1) caso (j.choice2) no funcionan.

He intentado con el caso (j.choice1! = "") (J.choice2! = "") Pero en este escenario sigo teniendo la primera opción.

¿Qué me falta

+2

¿Por qué utiliza una declaración 'switch' para una tarea que mejor se adapta a una declaración 'if'? –

+0

Está alertando a "choice2" en los dos primeros casos. ¿Es eso lo que pretendías? – Syntactic

+0

Bueno, usted obtiene un voto para una pregunta extraña pero interesante. ¿Cuáles son tus posibles valores para 'j.choice1' y' j.choice2'? – lincolnk

Respuesta

17

Funciona para mí:

var a = 0, b = true; 

switch(true) { 
    case a: 
     alert('a'); 
     break; 
    case b: 
     alert('b'); 
     break; 
} 

Sin embargo, las etiquetas case deben ser iguales a true, no jut implícitamente verdaderas.
Además, solo se ejecutará el primer caso que se evalúe como true.

5

es necesario leer para arriba en la declaración switch. No deberías estar encendiendo un valor constante.

Parece ser que es necesario utilizar si las declaraciones, ya que realmente no quiere ser el cambio en su valor j:

success: function (j) {  
    if (j.choice1) 
    { 
     alert("choice1"); 
     break; 
    } 

    if (j.choice2) 
    { 
     alert("choice2"); 
     break; 
    } 

    alert("default"); 
    } 
} 
+1

Simplemente curioso: ¿por qué uno no debe activar un valor constante? –

+0

Proporcionará el mismo resultado cada vez. Es algo parecido a la condición 'if (x = y) ' – Pops

+0

@Lord Torgamus: técnicamente, sería similar si' y' fuera siempre verdad o siempre falsey. –

0

En un caso como este, una mejor manera de hacer esto es probablemente algo como:

success: function (j) { 
    if(j.choice1 || j.choice2) { 
     alert("choice2"); 
    } else { 
     alert("default"); 
    } 
} 
3

RESUELTO

Basado en SLaks respuesta que modificar el código de la siguiente manera

if(j.choice1){ var choice1=true;} else { var choice1=false;} 
    if(j.choice2){ var choice2=true;} else { var choice2=false;} 

    switch(true) 
    { 
     case choice1: 
      alert("choice1"); 
     break; 
     case choice2: 
      alert("choice2"); 
     break; 
     default: 
      alert("default"); 
     break; 
    } 

Para todos, preguntando por qué cambiar y no si.

El conmutador ejecutará solo 1 instrucción, pero si puede ejecutar más de 1 si se produce un error en la respuesta (por ejemplo, si establece choice1 y choice 2, alertará a ambos, pero el switch alertará únicamente choice1).

La respuesta esperando como la elección tiene que ver con la carga de la tarjeta de crédito al banco para que yo quiero para asegurarse de que sólo el 1 acción exetute

Gracias a todos

+3

Una cadena if/else if ejecutará como máximo una rama también. –

+0

Tienes eso invertido. Una 'if statement' solo ejecutará el bloque individual, usando' switch (true) 'o' switch (false) 'le permitirá pasar a una declaración adyacente más baja si omite el' break'. Tenga cuidado con el caso subsiguiente que no se evaluará. –

Cuestiones relacionadas