《Eloquent JavaScript》第3版第11章routeRequest本地运行报错求助
关于《Eloquent JavaScript》第11章
routeRequest本地运行报错的问题 问题描述
我正在阅读《Eloquent JavaScript》第三版第11章,运行以下代码时遇到问题:
routeRequest(bigOak, "Church Tower", "note", "Incoming jackdaws!");
这段代码在书中的交互式沙箱里能正常运行,但我把它加到本地保存的11_async.js文件(同时保存了crow-tech.js),执行node 11_async.js时会返回错误:Error: No route to Church Tower。只有用setTimeout设置3秒延迟调用才能正常运行:
setTimeout(() => { routeRequest(bigOak, "Church Tower", "note", "Incoming jackdaws!"); }, 3000)
我知道这是因为连接传播需要时间,但书中没提这个要求,想知道是不是我漏了什么?
解答
这是因为书中的交互式沙箱在页面加载阶段,已经提前完成了乌鸦网络的初始化以及节点间连接拓扑的构建工作,所以你直接调用routeRequest就能正常执行。
而本地运行环境中,crow-tech.js里的网络节点是通过异步逻辑完成邻居发现和路由表构建的——节点之间需要交换邻居信息、生成可达路由,这个过程需要一定时间。当你同步调用routeRequest时,路由表还没完成构建,自然找不到通往Church Tower的路径。
书中没有提及这个细节,是因为交互式环境已经将初始化的异步过程做了封装和预执行,把底层的等待逻辑隐藏了。你其实不需要依赖固定的3秒延迟,更合理的做法是监听网络初始化完成的信号,或者用异步等待的方式触发请求。比如可以查看crow-tech.js是否提供了初始化完成的回调函数,或者自行用Promise封装初始化逻辑,等路由表准备就绪后再调用routeRequest。
内容的提问来源于stack exchange,提问作者quantnoob
相关产品推荐
相关产品推荐

