小编raj*_*bzz的帖子

Angular 2 - 打字稿函数与外部js库的通信

使用Javascript Infovis Toolkit作为绘制图形和树木的外部库.我需要操作节点的onClick方法,以便异步地向服务器发送HTTP GET请求,并将来自服务器的数据分配给Angular服务类的属性和变量.通过使用webpack将所有已编译的类型脚本打包到单个js文件中,输出文件令人困惑且无法读取.因此,从外部js库调用已编译的js文件中的函数并不是最好的解决方案.

我在Angular服务中尝试以下解决方案,以便我可以毫无困难地访问此服务的属性:

document.addEventListener('DOMContentLoaded', function () {
  
  var nodes = document.querySelectorAll(".nodes"); // nodes = []
  
  for (var i = 0; i < nodes.length; i++) { // nodes.length = 0
    
    nodes[i].addEventListener("click", function () {
      
      // asynchronously sending GET request to the server
      // and assing receiving data to the properties of this Angular service
      
    });
  }

});
Run Code Online (Sandbox Code Playgroud)

但是,此解决方案不起作用,因为在Javascript Infovis Toolkit中,节点是在完成DOM渲染之后以及window.onload事件之后绘制的.这个库有一些生命周期方法,比如onAfterCompute(),它在绘图树完成后调用.如何触发全局事件以通知Angular服务树的绘制已完成并且它可以查询所有节点?

javascript typescript webpack angular2-services angular

11
推荐指数
1
解决办法
1万
查看次数

使用libfaketime时,setTimeout在Mac OS和Linux上的行为有所不同

libfaketime用于更改进程的时间速度时,超时设置将setTimout根据在Linux下运行时更改的时间到期,但根据在Mac OS下运行时的原始系统时间.

在Mac OS中:

DYLD_INSERT_LIBRARIES=src/libfaketime.1.dylib DYLD_FORCE_FLAT_NAMESPACE=y FAKETIME="@2020-12-24 00:00:00 x3600" node

> setTimeout(() => {console.log('hello');}, 3600 * 1000); // Takes an hour
Run Code Online (Sandbox Code Playgroud)

在Linux中:

LD_PRELOAD=src/libfaketime.1.so FAKETIME="@2020-12-24 00:00:00 x3600" node

> setTimeout(() => {console.log('hello');}, 3600 * 1000); // Takes a second
Run Code Online (Sandbox Code Playgroud)

在调查这个问题,我注意到libcclock_gettime功能是由Node.js的(libuv?)Linux下接受调查,但在Mac OS上运行时,不调用该函数.(我printflibfaketime函数中添加了一些内容)

node.js(libuv?)的实现有什么不同,导致Mac OS和Linux之间的行为差​​异?为什么存在这种差异?

我做的另一个观察是,使用Linux libfaketime的行为冻结时间setImmediate并且setTimeout(cb, 0)在Linux下的不同之处在于回调是在使用setImmediate时运行而不是在使用时运行setTimeout(cb, 0).

linux macos settimeout node.js libuv

5
推荐指数
0
解决办法
115
查看次数