执行函数

stopIf(condition, exp) 条件停止

当(if)条件(condition)为真时停止(stop)执行后续表达式(即终止事件执行),取而代之去执行exp表达式(如果有)。即使此表达式是在循环/$exp/函数里也一样,但除了异步函数外。

nop() 空函数

no operation的缩写,nop()本身什么也不做,直接返回一个空函数。
常用来简化执行多个参数,比exc(““)省一对引号。
在三元表达式中经常在某个条件下要执行多个函数,量少时一般是把多个函数表达式放在exc(““)里,如exc($l.arr = [1, 2, 3]; log($l.arr)),量多时则放入内部表达式$exp中,如exc($exp.name)
把这些函数表达式作为另一个函数的参数时也会执行,如nop($l.arr = [1, 2, 3], log($l.arr))。这些函数没额外的执行上下文,也不会等上一个函数执行完了才执行下一个,所以不会有返回值$r,也不适合依赖render()和timeout()等函数。
注意,exc()里多个函数用分号; ,nop()里用逗号, 间隔;exc()里要用引号,nop()不用。

exc(exp, ctx) 执行表达式

执行表达式exp。
对象ctx可选,将与当前执行环境上下文数据$ctx合并后给exp使用。

excA(exp, ctx) 异步执行表达式

异步执行表达式exp,不阻塞当前线程;A是Async(异步)的首字母。参考异步函数

excs(exp, count, ctx) 多次执行

多次执行表达式exp,共count次,当前执行$x次,从0次开始;其它同上

func(exp) 同步函数构造器

把表达式exp作为函数体包装成函数,在某个事件中调用此函数。比如
$v.search = func('$v.商品 = $product.search("path", $v.Q, $v.O)'),调用函数时传入的参数可以通过$args数组读取,第一个参数也可以通过$arg读取,如果传入的第一个参数是个对象则可以直接访问对象里的值,大多数时候是直接把当前执行上下文传进去:$v.search($ctx)

funcA(exp) 异步函数构造器

用法同上。区别是上面的同步函数会等到函数体内的表达式完全执行完成后才返回,比如读取数据库需要花费较长时间,所以不能用在页面展示中,而适合在事件中使用。这个异步函数则不会等待函数体内的异步操作而直接返回,所以不会造成页面卡顿,可以用在页面展示中。

直接执行exc(exp)与函数调用$v.fn = func(exp); $v.fn()的异同

  1. 用法不同
    第一种是在当前环境直接执行表达式exp。第二种是先定义成函数(即把表达式封装成函数)再执行。

  2. 传参不同
    第一种通过传入ctx对象合并到其执行环境中,表达式直接取用;第二种通过传入任意数量的参数,函数体通过$args数组及其参数位置下标取得。

  3. 受stopIf()的影响不同
    stopIf()里的条件为真时第一种会立刻停止所有表达式的执行,不管是exc()被执行体内部的表达式还是当前执行体外部表达式。而第二种仅会停止函数体内部后续表达式的执行而不会影响调用它的当前环境外部后续的表达式的执行。当然,如果是异步执行(excA)则与函数同。

  4. 执行上下文不同
    函数的执行上下文来自于被调用时传入的第一个参数和其定义的地方的上下文,而执行表达式是直接把表达式拿到当前上下文执行,无论它是哪里定义的。

  5. 当需要被多个地方多次执行时推荐使用函数;如果只是临时执行一下,比如符合某种条件时执行两三句表达式时推荐用直接执行。

    比如一个组件C的事件中要执行在页面ready中定义的内部表达式$exp.A,而$exp.A又需要执行另一个内部表达式$exp.B。
    如果是第一种方式,需要先把ready定义的内部表达式转换成作用域更大的变量中(如页面表达式),$v.A = $exp.A; $v.B = $exp.B,在$exp.A里应该用$v.B而不是$exp.B,因为组件C不认识ready的内部表达式$exp.B,这样在组件C执行exc($v.A)时就好像$exp.A和$exp.B都是在组件C中定义的一样。但此时$exp.A和$exp.B里要谨慎使用stopIf()
    如果是第二种方式,需要先把$exp.A封装成函数$v.A = func($exp.A),在组件C中调用$v.A()即可。但要注意$exp.A和$exp.B拿到的上下文数据都是ready的而不是组件C的。此时$exp.A或$exp.B中的stopIf()并不会阻住组件C继续执行函数后面的表达式。


由众触低代码平台生成和驱动