使函数等待另一个变量

时间:2013-07-17 23:18:29

标签: javascript jquery function

我最近进入了一个项目,需要两个不同的方法来处理两个不同的变量,但我需要存储这两个值,以便在另一个函数中使用它们。

这有点复杂,所以让我解释一下。我有这个switch语句,可以监视几个数字: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;
}

正如您所看到的,我需要在变量获取值之前获取“hello”的值。我无法更改顺序,也无法更改变量声明,因此我必须对此设置执行某些操作。

我想在13中进行函数调用:

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

case 13:
    getMyVariable(hello);
    break;

然后当然函数仍将返回undefined。

我想做的是让函数等待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并在此处执行代码。 你可以跟我来吗?如果您需要更多信息,请告诉我!

4 个答案:

答案 0 :(得分: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;
}

注意:如果您只想存储下一个操作,则不需要数组。

答案 1 :(得分: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;

}

答案 2 :(得分: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 13case 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;
}

答案 3 :(得分:-1)

你可以简单地滥用for循环(或任何循环)来编写JS中的goto:

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

我宁愿看到你使用异步模式,不管怎么说这些都很流行,但如果其他所有方法都失败了,也许这会有所帮助。