【问题标题】:How can you use the Deno.watchFs infinite async iterable without blocking?如何在不阻塞的情况下使用 Deno.watchFs 无限异步迭代?
【发布时间】:2022-09-27 09:17:40
【问题描述】:

所以Deno 有一个filesystem watcher API,这似乎……对我来说很迟钝。也许这仅仅是因为我对异步迭代器的无知。它显示为这样使用:

const watcher = Deno.watchFs(\"/directory\")
for await (const event of watcher) {
    //process events
}
//code here is never executed

watcher 是一个无限的异步迭代,这意味着这个 for 循环将永远阻塞。编写代码来处理这些事件以使其不会阻塞函数的明智方法是什么?

旁白:为什么他们不只是简单地有一个回调/事件监听器样式接口?

标签: javascript async-await filesystemwatcher deno async-iterator


【解决方案1】:

除了要在 FsWatcher 关闭后运行的代码之外,循环之后没有任何内容。

async function watchFs(){
  const watcher = Deno.watchFs("/directory")
  for await (const event of watcher) {
      //process events
  }
  // some finalisation
}

const watcher = watchFs().catch(handleSomething)
moreThings()

这是显示相同概念的不同方式。我不会争辩 async/await “是一个糟糕的设计”,因为它的目的是在顺序视图中向您展示异步程序的流程。

async function watchFs(){
  const stream = stream.watchFs("/directory")

  stream.on('change', (event) => {
     // process events
  })

  stream.on('end', () => {
     // some finalisation
  }

  stream.on('error', (error) => {
      handleSomething()
  })
 
  return stream 
}

const watcher = watchFs()

【讨论】:

  • 说“这很简单,只是在 for 循环之后没有任何代码”有点像去看医生并告诉他们当你举起手臂时很痛,只是让他们告诉你“那么不要举起你的手臂”手臂。”我想我通过使用立即调用的异步箭头函数解决了这个问题。它可以工作,但如果它使这种事情变得必要,那么使用无限异步迭代器似乎是一个糟糕的设计。
  • 这是显示相同概念的另一种方式,无论以哪种方式调用,这个文件观察器都会在后台永远存在一些东西。我不会争辩 async/await “是一个糟糕的设计”,因为它的目的是在顺序视图中向您展示异步程序的流程。
猜你喜欢
  • 2021-06-10
  • 1970-01-01
  • 2019-10-27
  • 1970-01-01
  • 2018-12-13
  • 2016-07-04
  • 1970-01-01
  • 2011-09-01
  • 2012-05-07
相关资源
最近更新 更多