首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于node.js fs.readdir异步递归目录搜索的延迟评估/流/玻璃钢代码

用于node.js fs.readdir异步递归目录搜索的延迟评估/流/玻璃钢代码
EN

Stack Overflow用户
提问于 2013-07-12 03:43:04
回答 1查看 1.4K关注 0票数 2

我尝试实现一个使用FileSystem读取node.js目录树的列表结构

DIR/文件结构:

代码语言:javascript
复制
DIR1
     DIR2R
     file1
     file2
     file3
     …

->列表结构:

代码语言:javascript
复制
("DIR1" ("DIR2" "file1" "file2" "file3" …))

 DIR()   //looks like a C function
 file    //looks like an Atom value

例如,给定的UNIX根DIR:

代码语言:javascript
复制
root bin  cd
          ls

     lib  file1
          file2

     opt

     usr  file3

     file4

相当于一个列表:

代码语言:javascript
复制
("root" ("bin" ("cd" "ls")
         "lib" ("file1" "file2") 
         "opt" ()
         "usr" ("file3")
         "file4"
        )
)

话虽如此,我还是想用一些惰性异步序列(/ Infinite?)来实现这段代码。

node.js fs.readdir递归目录搜索 是一个很好的参考。

node.js有许多优秀的库,如file.walk等,但这是一个非常有趣的主题,事实上,许多代码示例都存在。

换句话说,一个很好的学科学习惰性异步序列的基本概念(流/无限列表?),而代码可以是一个很好的库,我想从头到尾实现。

子栈/流-手册 介绍了如何使用 编写node.js程序的基础知识。非常优秀的文章.

因此,下面是我对这个主题的思考-递归Dir树处理:

  • 本主题涉及递归搜索,有两种方法:异步和同步,出于各种原因,我选择了异步方法。
  • 搜索结果相当于一个列表结构,其中函数式编程范式非常重要(Lisp/Scheme)。
  • 对于JavaScript函数式编程,有一些库,如underscore.js,以及最近有一个重要区别的lazy.js:惰性评估(也称为延迟执行),其中的性能似乎优于underscore.js。
  • lazy.js还在Node.js中封装了流处理。我还发现stream.js说:无限数量的元素。他们的力量来自懒惰的评估,简单地说,这意味着他们可以包含无限的项目。。
  • 流数据(无限列表)实现了反应函数编程(玻璃钢)范式。lazy.js实际上演示了一个鼠标事件玻璃钢实现。RxJS是一个玻璃钢库:RxJS或是一个用于转换、组合和查询数据流__的库。
  • 本课题的异步方法是FRP课题。
  • 因此,惰性评估是加快列表处理功能编程的一个核心因素,并将List扩展到无限列表( data ),将异步/事件集成到流数据源中,在函数式编程范式(FunctionalReactiveProgramming)中进行处理。
  • Introduction清楚地指出:当您需要像对待列表一样处理事件流时,懒惰是非常有用的。当前最好的用例是从异步函数返回一个惰性列表,并通过事件将数据注入其中。在异步编程中,您不能仅仅返回一个常规列表,因为您还没有它的数据。到目前为止,通常的解决方案是提供一个回调,在数据可用时调用该回调。但是这样做,您就失去了链接函数和创建管道的能力,从而导致接口不太好。(参见下面的第二个示例,看看它如何改进了我的一个模块中的接口。)

最后,这里是我关于这个主题的问题-递归Dir树处理:

是否有任何示例代码专门以懒惰的评估或玻璃钢的方式实现该主题?

我知道lazy.js、stream.js或linq.js是基于惰性评估的,但其中任何一个都不能将node.js fs.readdir定义为异步处理(玻璃钢)的流数据。根据http://danieltao.com/lazy.js/docs/AsyncSequence.html的说法,它还没有实现,对吧?

RxJS也许可以,但我不知道怎么做。

一事无成。

有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2015-01-08 17:59:18

下面是一个基于https://gist.github.com/edygar/ee0945a73c79182367df的开始

给定一个目录,它会生成一个子目录列表。

(coffeescript)

代码语言:javascript
复制
Rx = require "rx"
fs = require "fs"

readdir = Rx.Observable.fromNodeCallback fs.readdir
stat = Rx.Observable.fromNodeCallback (pathName, cb) ->
    fs.stat pathName, (err, stats) ->
        stats.pathName = pathName
        cb err, stats

dirObservable = (dirPath) ->
    readdir dirPath
        .flatMap (items) -> Rx.Observable.from items
        .flatMap (item) -> stat item
        .filter (stats) -> stats.isDirectory()
        .map (stats) -> stats.pathName

module.exports = dirObservable


if not module.parent
    path = require "path"
    dirobs = dirObservable path.resolve __dirname, ".."
    dirobs.subscribe (data) -> console.log data
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17607141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档