Node.js解决循环依赖问题的两种方法介绍

如果下载的源码需要作者授权,请更换源码。本站免费分享资源不会增加授权

本篇文章给大家带来的内容是关于Node.js解决循环依赖问题的两种方法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

本文重点是讲解如何解决循环依赖这个问题。关心这个问题是如何产生的,可以自行谷歌。

如何重现这个问题

// a.js const {sayB} = require('./b.js') sayB() function sayA () {   console.log('say A') } module.exports = {   sayA }
// b.js const {sayA} = require('./a.js')  sayA()  function sayB () {   console.log('say B') }  module.exports = {   sayB }

执行下面的代码

  test git:(master)  node a.js /Users/dd/wj-gitlab/tools/test/b.js:3 sayA() ^  TypeError: sayA is not a function     at Object.<anonymous> (/Users/dd/wj-gitlab/tools/test/b.js:3:1)     at Module._compile (module.js:635:30)     at Object.Module._extensions..js (module.js:646:10)     at Module.load (module.js:554:32)     at tryModuleLoad (module.js:497:12)     at Function.Module._load (module.js:489:3)     at Module.require (module.js:579:17)     at require (internal/module.js:11:18)     at Object.<anonymous> (/Users/dd/wj-gitlab/tools/test/a.js:1:78)     at Module._compile (module.js:635:30)

sayA is not a function那么sayA是个什么呢,实际上它是 undefined

遇到这种问题时,你最好能意识到可能是循环依赖的问题,否则找问题可能事倍功半。

如何找到循环依赖的的文件

上文的示例代码很简单,2个文件,很容易找出循环依赖。如果有十几个文件,手工去找循环依赖的文件,也是非常麻烦的。

下面推荐一个工具 madge, 它可以可视化的查看文件之间的依赖关系。

注意下图1,以cli.js为起点,所有的箭头都是向右展开的,这说明没有循环依赖。如果有箭头出现向左逆流,那么就可能是循环依赖的点。

图2中,出现向左的箭头,说明出现了循环依赖,说明要此处断开循环。

Node.js解决循环依赖问题的两种方法介绍
【图1】

Node.js解决循环依赖问题的两种方法介绍

【图2】

如何解决循环依赖

方案1: 先导出自身模块

将module.exports放到文件头部,先将自身模块导出,然后再导入其他模块

// a.js module.exports = {   sayA }  const {sayB} = require('./b.js')  sayB()  function sayA () {   console.log('say A') }
// b.js module.exports = {   sayB }  const {sayA} = require('./a.js')  console.log(typeof sayA)  sayA()  function sayB () {   console.log('say A') }

方案2: 间接调用

通过引入一个event的消息传递,让多个个模块可以间接传递消息,多个模块之间也可以通过发消息相互调用。

// a.js require('./b.js') const bus = require('./bus.js')  bus.on('sayA', sayA)  setTimeout(() => {   bus.emit('sayB') }, 0)  function sayA () {   console.log('say A') }  module.exports = {   sayA }
// b.js const bus = require('./bus.js')  bus.on('sayB', sayB)  setTimeout(() => {   bus.emit('sayA') }, 0)  function sayB () {   console.log('say B') }  module.exports = {   sayB }
// bus.js const EventEmitter = require('events')  class MyEmitter extends EventEmitter {}  module.exports = new MyEmitter()

总结

出现循环依赖,往往是代码的结构出现了问题。应当主动去避免循环依赖这种问题,但是遇到这种问题,无法避免时,也要意识到是循环依赖导致的问题,并找方案解决。

最后给出一个有意思的问题,下面的代码运行node a.js会输出什么?为什么会这样?

// a.js  var moduleB = require('./b.js')  setInterval(() => {   console.log('setInterval A') }, 500)  setTimeout(() => {   console.log('setTimeout moduleA')   moduleB.sayB() }, 2000)  function sayA () {   console.log('say A') }  module.exports = {   sayA }
// b.js var moduleA = require('./a.js')  setInterval(() => {   console.log('setInterval B') }, 500)  setTimeout(() => {   console.log('setTimeout moduleB')   moduleA.sayA() }, 2000)  function sayB () {   console.log('say B') }  module.exports = {   sayB }
本文由(壳先生)整理自网络,如转载请注明出处:https://www.mrshell.com;
本站发布的内容若侵犯到您的权益,请邮件联系 i@mrshell.com 删除,我们将及时处理!
===========================================================================

1. 本站大部分下载资源收集于网络,不保证其完整性以及安全性,请下载后自行测试。
2. 本站资源仅供学习和交流使用,版权归资源原作者所有,请在下载后24小时之内自觉删除。
3. 不得使用于非法商业用途,商用请支持正版!不得违反国家法律,否则后果自负!
4. 若作商业用途,请购买正版,由于未及时购买和付费发生的侵权行为,与本站无关。
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!

=================================================================

壳先生 » Node.js解决循环依赖问题的两种方法介绍

发表评论

提供最优质的资源集合

立即查看 了解详情