为何仅第一个console.log执行?Node.js同步异步不一致API问题
问题分析:为何仅第一个console.log语句执行?
核心原因是inconsistentRead函数的同步/异步行为不一致,直接导致第二个回调永远无法触发,具体拆解如下:
第一次创建
reader1时,缓存cache中没有data.txt的内容,inconsistentRead会走异步的readFile分支。此时createFileReader先返回带有onDataReady方法的对象,我们调用reader1.onDataReady把第一个日志回调加入listeners数组。等readFile异步完成后,才会触发回调遍历listeners,执行第一条console.log。第一条日志的回调执行时,我们创建
reader2,这时候缓存已经存有data.txt的内容,inconsistentRead会同步执行传入的回调(也就是listeners.forEach(listener => listener(value)))。但此时reader2刚创建完成,还没来得及调用reader2.onDataReady把第二个日志回调加入listeners数组——同步回调已经执行完毕,数组是空的,所以第二个console.log永远不会被触发。
这种同步/异步混用的API是典型的陷阱,会让代码执行顺序完全超出预期,也是《Node.js设计模式》里重点提醒的危险场景。
内容的提问来源于stack exchange,提问作者Avalanche
相关产品推荐
相关产品推荐

