importOnce()

名称

importOnce - 全局只导入执行一次指定的 js 文件。

语法

importOnce(<filename>)

类别

Global

描述

在编写新的js脚本时存在重用现有脚本的可能性。可通过该命令将 js 文件导入并执行。

Note:

  • 在一段js脚本中,如果导入的文件和该脚本对同个函数有多个定义,那么在先导入文件再在脚本中定义相同函数的场景下,实际生效的函数定义将会是导入文件中的函数定义。导致这个现象的原因是js运行前会先读取该段js脚本的函数定义,而导入的文件中的函数定义是在运行importOnce方法时才读取的,这导致了最终生效的是导入文件中的函数定义。通过将脚本中的函数放置到别的文件中再导入,可以规避这个问题。

参数

  • filename ( String必填 )

js文件的相对路径名或全路径名。

返回值

成功:无返回值。

失败:抛出异常。

错误

importOnce()函数常见异常如下:

错误码错误类型可能的原因解决方法
-152SDB_SPT_EVAL_FAIL导入的文件执行失败根据错误信息提供的行号解决问题

当异常抛出时,可以通过getLastError()获取错误码,或通过getLastErrMsg()获取错误信息。可以参考常见错误处理指南了解更多内容。

版本

v2.9及以上版本。

示例

  • 导入执行 helloWorld.js 文件多次,全局只导入执行一次。

1) helloWorld.js 内容如下:

  1. function sayHello()
  2. {
  3. println( "hello world" ) ;
  4. }
  5. println( "import helloWorld.js" ) ;

2) 多次导入执行 helloWorld.js,只在第一次导入执行文件。

  1. > importOnce( 'helloWorld.js' )
  2. import helloWorld.js
  3. Takes 0.000849s.
  4. > importOnce( 'helloWorld.js' )
  5. Takes 0.000354s.
  6. > sayHello()
  7. hello world
  8. Takes 0.000436s.
  • 函数重复定义问题及规避方法

    • 问题描述举例

1) funcDef.js 内容如下:

  1. function test()
  2. {
  3. println( "defined in funcDef.js" ) ;
  4. }

2) test.js 内容如下:

  1. importOnce( './funcDef.js' ) ;
  2. function test()
  3. {
  4. println( 'defined in test.js' ) ;
  5. }
  6. test() ;

3) 使用 sdb 执行 test.js 文件

  1. $ ./sdb -f test.js
  2. defined in funcDef.js

可以发现,实际生效的是 funcDef.js 中的函数定义。

  • 规避方法

可以通过将脚本中的函数定义放置到单独的文件再导入来规避这个问题

1) 增加文件 userDef.js,内容如下:

  1. function test()
  2. {
  3. println( 'defined in userDef.js' ) ;
  4. }

2) test.js 内容改为:

  1. importOnce( './funcDef.js' ) ;
  2. importOnce( './userDef.js' ) ;
  3. test() ;

3) 使用 sdb 执行 test.js 文件

  1. $ ./sdb -f test.js
  2. defined in userDef.js

可以发现,实际生效的是 userDef.js 中的函数定义。