关于 Eloquent Javascript 第三版第 11 章

问题描述 投票:0回答:1

我正在阅读《Eloquent Javascript 第三版》第 11 章(链接:https://eloquentjavascript.net/11_async.html),但我很难让以下代码行正常工作:

routeRequest(bigOak, "Church Tower", "note", "Incoming jackdaws!");

代码可以在交互式沙箱中运行,但是如果我尝试自己运行该行代码(保存文件https://eloquentjavascript.net/code/chapter/11_async.jshttps://eloquentjavascript.net /code/crow-tech.js 在本地目录中,将上述代码片段添加到 11_async.js 文件并运行“node 11_async.js”)它返回错误,“错误:没有通往教堂塔楼的路线”。它起作用的唯一方法是如果我运行一些 setTimeout:

setTimeout(() => {
  routeRequest(bigOak, "Church Tower", "note", "Incoming jackdaws!");
}, 3000)

这对我来说很有意义,因为传播所有连接需要一些时间,但是章节/作者没有描述需要使用 setTimeout/delay 运行,我想知道我是否遗漏了一些东西......

感谢任何帮助...

javascript asynchronous
1个回答
0
投票

Eloquent 还有一个沙箱。请检查文件“crow-tech.js”。其中的代码专门等待 500 毫秒,以便routeRequest、findInStorage 和chicks 仅在网络信息传播后才起作用。

if (typeof __sandbox != "undefined") {
    __sandbox.handleDeps = false
    __sandbox.notify.onLoad = () => {
      // Kludge to make sure some functions are delayed until the
      // nodes have been running for 500ms, to give them a chance to
      // propagate network information.
      let waitFor = Date.now() + 500
      function wrapWaiting(f) {
        return function(...args) {
          let wait = waitFor - Date.now()
          if (wait <= 0) return f(...args)
          return new Promise(ok => setTimeout(ok, wait)).then(() => f(...args))
        }
      }
      for (let n of ["routeRequest", "findInStorage", "chicks"])
        window[n] = wrapWaiting(window[n])
    }
  }
© www.soinside.com 2019 - 2024. All rights reserved.