NodeJS 在异步函数(asyncawait)中调用栈打印不全的问题

JavaScript030

NodeJS 在异步函数(asyncawait)中调用栈打印不全的问题,第1张

我在 index.ts 中调用 time-helper.ts 中的 waitForFn(),出错的调用栈是这样的:

这个调用栈有啥问题呢?只显示出了 time-helper 模块的文件信息,完全不显示调用者的信息,这样一来,完全不知道是谁调用了这个 waitForFn() 函数。你从错误信息里都不知道是哪个函数出错了。

出现这种情况,原因在这里:「链接」

解决办法在这里:「链接」

简单总结下 ,就是:

在异步函数返回之前,系统会清空当前调用线,然后把异步函数中的调用栈写进去。

解决办法 :只要把tsconfig.json文件中的compilerOptions.target改成es2018或以上的版本即可。

改完后效果:

可见整个调用栈都非常清晰。

首先,你给出的这个函数 是个严重有缺陷的调用,他会无限递归最终内存溢出,

其次 你这段代码是要运行在什么地方,如果运行在浏览器中,不同浏览器解析到这段代码都会主动报错,不会调用,如果你运行在node环境,这段代码运行会依照你物理内存大小 和系统内存分配方法进行调用 最终爆掉,很显然,你的问题没有完整的条件

记录这个调用也很简单,在函数外部声明一个变量 并且赋值为0;并且在调用的时候给这个变量做自增操作,最后的数据就是完成调用到溢出的调用次数。

关于内存结构,假设一个 数据类型是整数,8字节 ,这句话本身就是个问题,首先Var A = 1这是声明了一个 类型为整数的 变量,这个时候 他在栈中声明了一个东西叫A 同时 指向了池的1 所以 这个8字节代表了2部分,他的栈空间占用就是最终调用函数的次数;不管是什么数据类型,变了的声明都是在栈中,数据都在池里面。如果只是声明了 var A 但是并不赋值,此时他在内存结构中 只会占用栈空间,但是没有数据类型;跟没有整数,字符串,数组,对象,undiluted,这样的数据类型之分了。

我个人觉得,这要么是一个非常刁钻的考试题,要么就是不知道谁脑子有毛病想出来的,显然这是一个非常不科学的题目,实际情况程序是根本跑不起来的,