module.evaluate([options])


  • options <Object>
    • timeout <integer> 指定在终止执行之前评估的毫秒数。如果执行被中断,将抛出 Error。此值必须是严格正整数。
    • breakOnSigint <boolean> 如果为 true,接收到 SIGINTCtrl+C)将终止执行并抛出一个 Error。在脚本执行期间,通过 process.on('SIGINT') 附加的现有事件处理程序将被禁用,但在脚本执行后仍然继续工作。默认值: false
  • 返回:<Promise> 成功时返回 undefined

评估模块及其依赖。对应 ECMAScript 规范中 循环模块记录Evaluate() 具体方法 字段。

【Evaluate the module and its depenendencies. Corresponds to the Evaluate() concrete method field of Cyclic Module Records in the ECMAScript specification.】

如果模块是 vm.SourceTextModule,必须在模块实例化后调用 evaluate();否则 evaluate() 将返回一个被拒绝的 Promise。

【If the module is a vm.SourceTextModule, evaluate() must be called after the module has been instantiated; otherwise evaluate() will return a rejected promise.】

对于 vm.SourceTextModuleevaluate() 返回的 Promise 可能会同步或异步地被完成:

【For a vm.SourceTextModule, the promise returned by evaluate() may be fulfilled either synchronously or asynchronously:】

  1. 如果 vm.SourceTextModule 本身或其任何依赖中没有顶层 await,则在模块及其所有依赖被评估后,Promise 将会 同步 地被完成。
    1. 如果评估成功,该 Promise 将会同步解析为 undefined
    2. 如果评估结果出现异常,该 promise 将会被 同步 拒绝,并携带导致评估失败的异常,这与 module.error 相同。
  2. 如果 vm.SourceTextModule 本身或其任何依赖中包含顶层 await,则该 Promise 将在模块及其所有依赖被评估后 异步 完成。
    1. 如果评估成功,该 Promise 将被_异步_解析为 undefined
    2. 如果评估结果导致异常,该承诺将被 异步 拒绝,并伴随导致评估失败的异常。

如果该模块是 vm.SyntheticModuleevaluate() 总是返回一个同步完成的 promise,参见 评估()一个合成模块记录 的规范:

【If the module is a vm.SyntheticModule, evaluate() always returns a promise that fulfills synchronously, see the specification of Evaluate() of a Synthetic Module Record:】

  1. 如果传递给其构造函数的 evaluateCallback 同步抛出异常,则 evaluate() 会返回一个会被同步拒绝并带有该异常的 promise。
  2. 如果 evaluateCallback 没有抛出异常,evaluate() 会返回一个将会同步解析为 undefined 的 Promise。

vm.SyntheticModuleevaluateCallback 会在 evaluate() 调用中同步执行,其返回值会被丢弃。这意味着如果 evaluateCallback 是一个异步函数,evaluate() 返回的 Promise 不会反映其异步行为,并且异步 evaluateCallback 中的任何拒绝都会丢失。

【The evaluateCallback of a vm.SyntheticModule is executed synchronously within the evaluate() call, and its return value is discarded. This means if evaluateCallback is an asynchronous function, the promise returned by evaluate() will not reflect its asynchronous behavior, and any rejections from an asynchronous evaluateCallback will be lost.】

evaluate() 在模块已经被评估之后也可以再次调用,在这种情况下:

  1. 如果初始评估成功结束(module.status'evaluated'),它将什么也不做,并返回一个解析为 undefined 的 Promise。
  2. 如果初始评估导致了异常(module.status'errored'),它将重新拒绝初始评估产生的异常。

在模块正在评估 (module.status'evaluating') 时,无法调用此方法。

【This method cannot be called while the module is being evaluated (module.status is 'evaluating').】