You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

《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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 20:48:23