首页 > 解决方案 > Electron setTimeout 在渲染器进程中返回数字而不是 Timeout 对象

问题描述

我注意到在 Electron 的渲染器进程中setTimeout节点函数返回一个number(整数)而不是一个Timeout对象。

在主进程中,它返回预期的Timeout对象

我使用最新版本(即4.0.5)。

.

渲染器进程的控制台:

在此处输入图像描述

主进程控制台:

npm start

> electron-timer-bug@0.0.1 start /home/doom/Documents/projets/testElectron/electron-timer-bug
> electron .

/home/doom/Documents/projets/testElectron/electron-timer-bug/node_modules/electron/dist/electron: /lib/x86_64-linux-gnu/libdbus-1.so.3: no version information available (required by /home/doom/Documents/projets/testElectron/electron-timer-bug/node_modules/electron/dist/electron)
/home/doom/Documents/projets/testElectron/electron-timer-bug/node_modules/electron/dist/electron: /lib/x86_64-linux-gnu/libdbus-1.so.3: no version information available (required by /home/doom/Documents/projets/testElectron/electron-timer-bug/node_modules/electron/dist/electron)
Fontconfig warning: "/etc/fonts/fonts.conf", line 86: unknown element "blank"
mainWatchdog :  Timeout {
  _called: false,
  _idleTimeout: 1000,
  _idlePrev:
   TimersList {
     _idleNext: [Circular],
     _idlePrev: [Circular],
     _unrefed: false,
     msecs: 1000,
     _timer: Timer { _list: [Circular] } },
  _idleNext:
   TimersList {
     _idleNext: [Circular],
     _idlePrev: [Circular],
     _unrefed: false,
     msecs: 1000,
     _timer: Timer { _list: [Circular] } },
  _idleStart: 648,
  _onTimeout: [Function],
  _timerArgs: undefined,
  _repeat: null,
  _destroyed: false,
  [Symbol(unrefed)]: false,
  [Symbol(asyncId)]: 7,
  [Symbol(triggerId)]: 5 }
typeof(mainWatchdog) :  object
mainWatchdog.constructor.name:  Timeout
main callback

有或没有 nodeIntegration 都是一样的。

这是测试仓库:https ://gitlab.com/doom-fr/electron-timer-bug

正常吗?怎么了?

厄运

标签: javascriptnode.jselectronsettimeout

解决方案


渲染器进程中setTimeout()window.setTimeout()是一个返回整数的 Web API 函数:

返回值

返回的 timeoutID 是一个正整数值,用于标识调用 setTimeout() 创建的计时器;可以将此值传递给 clearTimeout() 以取消超时。

而在main process 中setTimeout()是一个 Node.js全局对象方法(在Timers中描述),它返回一个Timeout对象:

setTimeout(回调,延迟[,...参数])

  • callback 当计时器结束时调用的函数。
  • delay 在调用回调之前等待的毫秒数。
  • ...args 调用回调时传递的可选参数。

返回: <Timeout> 用于 clearTimeout()

为了从渲染进程调用 Node.js 方法,你必须使用 Electron 的远程getGlobal方法;例如:

require('electron').remote.getGlobal('setTimeout')(() => { console.log('done'); }, 2000);

推荐阅读