2013-07-17 2 views
0

В последнее время я вхожу в проект, для которого требуются два разных метода для двух разных переменных, но мне нужно сохранить оба этих значения, чтобы использовать их в другой функции.Сделать функцию wait для другой переменной

Это немного сложно, поэтому позвольте мне объяснить. Я получил этот переключатель заявление, что часы для нескольких номеров: 2,3,13,45

var hello; 
switch ($variable) { 
    case 2: 
     //do something irrelevant 
     break; 
    case 3: 
     //do something irrelevant 
     break; 
    case 13: 
     //do something with variable named "hello". Ex.: 
     alert(hello); 
     break; 
    case 45: 
     hello = "hello"; 
     break; 
} 

Как вы можете видеть, мне нужно, чтобы получить значение «привет», прежде, чем переменная получает значение. Я не могу изменить порядок, и я не могу изменить объявление переменной, поэтому мне нужно что-то сделать с этой настройкой.

То, что я думал, что должен был сделать вызов функции в 13:

function getMyVariable(variable) { 
    var v = variable; 
    return variable; 
} 

case 13: 
    getMyVariable(hello); 
    break; 

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

То, что я хотел бы сделать, чтобы сделать функцию ожидания для набора переменных в 45:

(обратите внимание, что это только предположение, этот код не путь рядом работает)

case 45: 
    hello = "hello"; 
    getMyVariable(hello); 
    break; 

function getMyVariable(variable) { 
    //function gets call from case 13 
    //if type is undefined, wait for a variable that isn't undefined 
    //if variable isn't undefined return the variable 
} 

Итак, сначала в первом случае пропустите случай 13, пусть случай 45 задает переменную, а затем вернется к случаю 13 и выполнит код здесь. Можете ли вы следовать за мной? Скажите мне, если вам нужна дополнительная информация!

+0

Это невозможно. Это либо случай 13, либо случай 45, а не оба. – Bergi

+0

Не могли бы вы опубликовать весь сценарий? Трудно получить общую картину того, что вы намереваетесь сделать. Что передают эти несколько чисел в оператор switch, и как? И почему вы не можете просто переместить присваивание hello = "hello" в начало, действительно ли оно полагается на то, что происходит в случае 45? – Bergi

+0

Я не могу переместить назначение, он полагается на то, что ** только ** происходит в случае 45. К сожалению, я не могу отправлять код, это проект предприятия.:( – PeterInvincible

ответ

1
// this needs to be defined somewhere outside that it is preserved 
// between calls to the code that contains `switch` 
var doThisWhenHelloIsSet = []; 

// ... 
var hello; 
switch ($variable) { 
    // ... 
    case 13:    
     doThisWhenHelloIsSet.push(function(h) { 
      // do something with argument named "h" 
      // (which will have the value of variable named "hello"). 
      // Ex.: 
      alert(h); 
     }); 
     break; 
    case 45: 
     hello = "hello"; 
     for (var i = 0; i < doThisWhenHelloIsSet.length; i++) { 
      doThisWhenHelloIsSet[i](hello); 
     } 
     doThisWhenHelloIsSet = []; 
     break; 
} 

Примечание: Если вы хотите сохранить только одну следующее действие, то вам не нужен массив.

+0

отлично, работает по назначению, большое спасибо! +++ – PeterInvincible

0

Не совсем уверен, что я понимаю, но это то, что вы хотите?

var hello = null; 
switch ($variable) { 
case 2: 
    //do something irrelevant 
    break; 
case 3: 
    //do something irrelevant 
    break; 
case 13: 
    //do something with variable named "hello". Ex.: 
    if (hello !== null) { 
     alert(hello); 
    } 
    break; 
case 45: 
    hello = "hello"; 
    break; 

}

+0

Вероятно, вы имеете в виду 'null', а не' NULL' ? – Bergi

+0

@Bergi Возможно, вы правы. – RiggsFolly

0

Вы можете заполнить case с помощью переменной hello. Проверьте, установлено ли оно с чек на $variable === 13.

var hello; 
switch (true) { 
    case $variable === 2: 
     // blah 
     break; 
    case $variable === 3: 
     // blah 
     break; 

    // this will get called when $variable is 13, 
    // and hello is not blank anymore 
    case !!hello && $variable === 13: 
     // do something magical 
     break; 

    case $variable === 45: 
     // set hello somewhere? 
     hello = 'hello'; 
     break; 
} 

Если то, что вы имели в виду в том, чтобы иметь как логика case 13 и case 45 обрабатываются сразу, вы всегда можете попробовать проваливаемся (хотя будьте осторожны).

var hello; 
switch ($variable) { 
    case 2 : 
     // blah 
     break; 
    case 3 : 
     // blah 
     break; 

    // notice I switched these last two up 
    case 45 : 
     hello = 'hello'; 
     // notice that there's no break statement 
     // so the logic flows into the case 13 right after case 45. 

    case 13 : 
     if (!!hello) { 
      // do something magical with hello 
     } 
     break; 
} 
-1

вы можете просто злоупотребляют для цикла (или любой петли на самом деле) закодировать Гото в JS:

var x=false, y=5; 

above: for(;;){ 

    switch(y){ 
    case 3: x=true; break; 
    case 5: y=3; continue above; 
    } 

    break above; 
} 

alert([x,y]); // shows: true,3 

я предпочел бы видеть, что вы используете шаблон асинхронной, те хороши популярны в любом случае, но, возможно, это поможет, если все остальное не удастся.

Смежные вопросы