1

我需要覆盖函数的一些行为,在它调用其他函数之后。问题是这个父函数是一个库,我不想改变它,所以像做一些标志或这个函数的另一个改变这样的解决方案不是很好。我知道我在函数中有一个可以更改的调用者对象,所以也许我可以用它弄清楚。下面是示例:

function parent()
{
  console.log("some need stuff");
  some.handler.function.from.config.that.i.can.change();
  console.log("need omit this right till the end");
}

function child()
{
  console.log("need to somehow stop evaluation of " + child.caller + " function");
}

作为一名 ruby​​ 程序员,我知道有 lambdas,您可以使用它从闭包的内部范围终止评估。但我不确定如何从 javascript 执行此操作。

4

3 回答 3

7

你不能直接这样做。(而且.caller已经过时了)

但是,您可以使用一个肮脏的技巧:

try{
    parentFunction();//calls child
}catch(e){
   //done
}

function child(){
    doWhatever();
    throw new Error("this will hopefully propagate");
}

小提琴

这只有在调用子进程时父进程本身没有捕获异常的情况下才会起作用。

此外,使用异常进行流控制通常是一个坏主意。将此作为最后的手段。

于 2013-06-29T19:18:38.413 回答
1

在调用库之前调用您控制的新函数,并将对您无法修改的库的调用包装在 try/catch 块中。

例如:

function meta-parent()
{
  try {
    parent();
  }
  catch (e){
      // don't really be empty!
  }
}

function parent()
{
  console.log("some need stuff");
  some.handler.function.from.config.that.i.can.change();
  // Nothing below here will run because of your child's exception
  console.log("need omit this right till the end");  
}

function child()
{
  console.log("need to somehow stop evaluation of " + child.caller + " function");
  throw new Error(); //breakout!
}

注意灵感:从子函数中打破父函数(最好是PHP)

于 2013-06-29T19:25:51.287 回答
0

正如 Benjamin Gruenbaum 指出的那样,使用异常来进行流控制应该被视为最后的手段,但是 Promises/A 提案(在某些实现中)是否不会以这种方式使这种异常利用合法化?

我确实认为从子函数抛出的(否则未捕获的)错误可能不是 Promises/A 作者所想的(即我们仍然可以说是在谈论“肮脏的把戏”),但是 Promises/A提案也没有明确排除这种错误传播。

Q lib 是解决这个问题的理想选择,允许这样的事情:

Q.fcall(parentFunction).then(function (value) {
    alert(value);
}, function (error) {
    alert(error);
});

小提琴

请注意,为方便起见,我还在小提琴中使用 jQuery,但只是为按钮提供功能。

于 2013-06-29T20:38:58.133 回答