【问题标题】:javascript - detect end of chained functions?javascript - 检测链接函数的结束?
【发布时间】:2009-12-19 21:56:05
【问题描述】:

今天我正在做一个使用链式函数调用的宠物项目,我很好奇如何检测链中最后一个函数何时执行。例如:

func1('initial data').func2().func3().func4();

在 func2-4 完成“初始数据”处理后,我想检测 func4 何时完成。由于 func4() 并不总是链中的最后一个函数,例如它可能以 .func3() 或 .func5() 结尾,或者我可以根据我想要做的事情混合我的函数调用,我正在尝试一种方法来检测没有更多的函数调用正在执行,但我还没有走得太远。

【问题讨论】:

  • 如果函数是同步的,那么这没什么特别的。一个函数在它返回时就完成了,不管它是否被链接。

标签: javascript function chaining


【解决方案1】:

你不能。

此外,如果它们没有被链接:

var v = func1('initial data');
v = v.func2();
v = v.func3();
v = v.func4();

你认为最后一个函数是什么?每个函数都是它自己的链中的最后一个函数,但是如果你在每一步之后都完成了一些事情,那就行不通了。

只需创建一个您最后调用的函数即可完成该过程。

【讨论】:

  • 是的,这基本上是我已经完成的。我创建了一个 done() 函数,所以我会像 func1().func2().func3().done();暂时效果还不错。
  • 当然可以。当函数返回时,则函数完成。
  • @Justin:你误解了这个问题。他不想知道每个功能何时完成,他想知道最后一个功能何时完成。
  • @Guffa 我没有误解。我也觉得他想知道最后一个功能什么时候完成。请参阅@Rich 的回答。
  • @Justin:你仍然完全没有抓住重点。他不想在之后进行额外的调用,而是从函数中检测到它。
【解决方案2】:

传统的做法是把你想做的任何事情放在最后一个函数之后的下一行:

func1('initial data').func2().func3().func4();
allFunctionsDone();

;)

【讨论】:

  • 没错。关于问题有值得注意的奇怪或神秘。当 JavaScript 同步执行时,它的行为与任何其他过程语言一样。当函数返回时,它就完成了,然后你就可以继续了。
【解决方案3】:

您可以编写音序器,这将帮助您为您执行此操作。与其直接调用,不如将函数的名称一一调用。像这样的

executeSequence(func1('init_dat'),[
    'func2',
    'func3',
    'func4'
]);

【讨论】:

  • 这样做的好处是零。
  • 我投了赞成票,因为如果返回的对象之一可能或可能没有链中的下一个方法,这是有好处的。 sequencer 可以在调用 next 方法之前检查它是否存在。
  • @Justin Johnoson,恕我直言:这完全取决于您使用此代码的方式和上下文。如果您构建一些可以参数化的动态代码,使用嵌套排序器、错误处理、start() 和 stop() 过程等,它会非常有用。
  • 让我重新表述一下,与实际问题相比,这样做的好处为零。虽然启动和停止程序等在某些情况下是有用且必要的,但这不是问题,支持这一点的逻辑远远超过必要。事实上,不需要额外的逻辑,因为 OP 的问题真的很简单,正如@Rich 所回答的那样。
猜你喜欢
  • 1970-01-01
  • 2011-04-27
  • 1970-01-01
  • 1970-01-01
  • 2016-02-25
  • 1970-01-01
  • 1970-01-01
  • 2012-05-06
  • 1970-01-01
相关资源
最近更新 更多