2009-12-19 32 views
0

今天我正在使用链式函数调用进行一个宠物项目,我很好奇当链中最后一个函数执行时我该如何检测。例如:javascript - 检测链接函数的结束?

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

而且func2-4后完成工作的“初始数据”我想,当FUNC4完成检测。由于func4()并不总是链中的最后一个函数,例如它可能以.func3()或.func5()结尾,或者我可以将函数调用取决于我正在尝试执行的操作,我试图想出一种方法来检测没有更多的函数调用正在完成,但我并没有走得很远。

+0

如果函数是同步的,那么这里没有什么特别的。函数返回时完成,无论它是否链接。正确。 – 2009-12-20 03:52:45

回答

4

你不能。

此外,如果他们没有链接:

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

什么,你会认为是最后的功能?每个函数都是它自己链中的最后一个函数,但是如果在每一步之后最终确定某个东西,那么这是行不通的。

只是做一个函数,你最后调用来完成过程。

+1

是的,这基本上是我已经做的。我已经创建了一个done()函数,所以我会链接如 func1()。func2()。func3()。done(); 目前它运作得很好。 – Geuis 2009-12-19 22:08:20

+0

当然可以。当函数返回时,函数完成。 – 2009-12-20 03:54:47

+0

@Justin:你误解了这个问题。他不想知道每个功能何时完成,他想知道什么时候完成功能。 – Guffa 2009-12-20 10:51:54

4

传统的做法是把任何你想要的下一行的最终功能后进行:

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

;)

+0

正确。问题有点奇怪或神秘。当JavaScript被同步执行时,它的行为就像任何其他过程语言一样。当函数返回时,它完成,然后你可以继续。 – 2009-12-20 03:56:33

3

你可以写的序,这将帮助你做到这一点的您。而不是执行直接的呼叫,转移功能的名称,并逐一打电话给他们。像这样的东西

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

对此没有任何好处。 – 2009-12-20 03:55:40

+0

我投票赞成,因为如果其中一个返回的对象可能或可能没有链中的下一个方法,那么这会有好处。序列器可以在调用它之前检查下一个方法是否存在。 – Rich 2009-12-20 09:23:00

+0

@Justin Johnoson,恕我直言:它完全取决于如何以及在何种情况下使用此代码。如果你构建了一些可以被参数化的动态代码,使用嵌套的顺序器,错误处理,start()和stop()等等,它可能非常有用。 – nemisj 2009-12-20 11:20:50