在 Node.js 中使用异步瀑布

2024-04-15

我有两个异步运行的函数。我想使用瀑布模型来编写它们。问题是我不知道怎么办..

这是我的代码:

var fs = require('fs');
function updateJson(ticker, value) {
  //var stocksJson = JSON.parse(fs.readFileSync("stocktest.json"));
  fs.readFile('stocktest.json', function(error, file) {
    var stocksJson =  JSON.parse(file);

    if (stocksJson[ticker]!=null) {
      console.log(ticker+" price : " + stocksJson[ticker].price);
      console.log("changing the value...")
      stocksJson[ticker].price =  value;

      console.log("Price after the change has been made -- " + stocksJson[ticker].price);
      console.log("printing the the Json.stringify")
      console.log(JSON.stringify(stocksJson, null, 4));
      fs.writeFile('stocktest.json', JSON.stringify(stocksJson, null, 4), function(err) {  
        if(!err) {
          console.log("File successfully written");
        }
        if (err) {
          console.error(err);
        }
      }); //end of writeFile
    } else {
      console.log(ticker + " doesn't exist on the json");
    }
  });
} // end of updateJson 

知道如何使用瀑布来编写它,以便我能够控制它吗?请给我写一些例子,因为我是 node.js 的新手


首先确定步骤并将它们编写为异步函数(采用回调参数)

  • 读取文件

    function readFile(readFileCallback) {
        fs.readFile('stocktest.json', function (error, file) {
            if (error) {
                readFileCallback(error);
            } else {
                readFileCallback(null, file);
            }
        });
    }
    
  • 处理文件(我删除了示例中的大部分console.log)

    function processFile(file, processFileCallback) {
        var stocksJson = JSON.parse(file);
        if (stocksJson[ticker] != null) {
            stocksJson[ticker].price = value;
            fs.writeFile('stocktest.json', JSON.stringify(stocksJson, null, 4), function (error) {
                if (err) {
                    processFileCallback(error);
                } else {
                    console.log("File successfully written");
                    processFileCallback(null);
                }
            });
        }
        else {
            console.log(ticker + " doesn't exist on the json");
            processFileCallback(null); //callback should always be called once (and only one time)
        }
    }
    

请注意,我在这里没有进行特定的错误处理,我将利用 async.waterfall 将错误处理集中在同一位置。

另请注意,如果异步函数中有 (if/else/switch/...) 分支,它总是调用回调一次(且仅一次)。

使用 async.waterfall 插入所有内容

async.waterfall([
    readFile,
    processFile
], function (error) {
    if (error) {
        //handle readFile error or processFile error here
    }
});

干净的例子

之前的代码过于冗长,无法使解释更清晰。这是一个完整的清理示例:

async.waterfall([
    function readFile(readFileCallback) {
        fs.readFile('stocktest.json', readFileCallback);
    },
    function processFile(file, processFileCallback) {
        var stocksJson = JSON.parse(file);
        if (stocksJson[ticker] != null) {
            stocksJson[ticker].price = value;
            fs.writeFile('stocktest.json', JSON.stringify(stocksJson, null, 4), function (error) {
                if (!err) {
                    console.log("File successfully written");
                }
                processFileCallback(err);
            });
        }
        else {
            console.log(ticker + " doesn't exist on the json");
            processFileCallback(null);
        }
    }
], function (error) {
    if (error) {
        //handle readFile error or processFile error here
    }
});

我保留了函数名称,因为它有助于提高可读性并有助于使用 chrome 调试器等工具进行调试。

如果你使用下划线 http://underscorejs.org/ (on npm https://www.npmjs.org/package/underscore),您还可以将第一个函数替换为_.partial(fs.readFile, 'stocktest.json')

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Node.js 中使用异步瀑布 的相关文章

随机推荐

  • Python中使用递归获取列表的长度

    我正在尝试计算列表的长度 当我在cmd上运行它时 我得到 RuntimeError maximum recursion depth exceeded in comparison 我不认为我的代码有什么问题 def len recursive
  • 捕获不带 \n 的输入

    我正在终端中制作一个简单的 2d 游戏 我一直想知道如何获得标准输入而不必返回 因此 用户不必按 w n n 用于返回 而只需按 w 即可前进 scanf gets 和 getchar 无法做到这一点 但我以前见过在 Vi 等程序中做到过
  • 如何使用 Invoke-Sqlcmd 连接到 SQL Server LocalDB?

    I have sqlcmd exe来自 SQL Server 2008 和 SQL Server 2012 PS C gt Get Command sqlcmd exe Definition C Program Files Microsof
  • 使用散景滑块滑动图像

    我试图在滑块的帮助下无缝地传达大量科学数据 我从 Bokeh 开始 对 javascript 几乎一无所知 我尝试设置第一种方法来滑动两个图像 但我无法刷新图像 假设我的文件夹中有 1 png 和 2 png from bokeh io i
  • 在 Visual Studio 中编译时如何将 DLL 保存在不同的文件夹中?

    假设我有一个窗口表格 控制台应用程序 C 与一些项目外部参考以及对同一解决方案中其他类库项目的引用 当我构建窗口形式项目 我希望引用的库存储在不同的位置 eg bin 发布 库 并且与 exe 不在同一文件夹中 可以做吗 您的问题有两部分
  • python 3 替代 dircache?

    在我重新发明轮子之前 谁能告诉我是否有单行语句的直接 或半直接 替代 allfiles dircache listdir 一条线 不 但你可以这样做 global cache def cached listdir path res glob
  • PHP 扰乱了 HTML 设计并在 HTML 之外显示结果

    我不确定为什么会发生这种情况 我在 HTML 或其他任何方面都不是 那么好 我主要假设我的问题是如何显示结果 任何提示 帮助 或建议都非常感谢 该脚本基本上是一个简单的 FoodManagement 类 它管理食物 哈哈 这是代码 inde
  • 未定义变量 - Switch 语句在 PHP 中是否具有作用域

    大家好 这是我第一次发帖 认为这会很好 因为我完全陷入困境 据我了解 PHP 中的 switch 和 If else 语句没有变量范围 我的问题是我有一个 CSV 文件 示例文件 其中包含大约 5 行值 我需要将其放入 mySQL DB 表
  • 从文件中动态读取资源

    我一直使用 resx 文件作为静态字符串 以便有一个中心位置来更改它们 问题是在项目构建和部署后我无法更改它们 我想在部署后更改一些字符串 而不重新启动进程 因此 config 文件已退出 可以编写有效解析配置文件 XML JSON YAM
  • 什么可能导致 PUSHD 失败?

    我有一个很棒的大脚本 完全依赖于 PUSHD 然而当我打字时突然pushd server1 dir1我越来越 C Documents and Settings userNameHere gt pushd server1 dir1 CMD d
  • 如何在底部屏幕上实现可滚动选项卡

    Newsvoice 在屏幕底部的底部栏顶部有一个可滚动的选项卡 我怎样才能实现这个用户界面 谢谢 这是一些使用的示例代码Column定位可滚动的TabBar and a BottomNavigationBar in the bottomNa
  • SetInterval 是否在单独的线程上运行?该方法如何运作?

    我环顾四周试图了解如何SetInterval但只找到了如何使用它 我已经知道它的功能 我只是好奇当 JS 不支持线程时它如何能够在单独的线程上运行某些东西 至少这是我读到的 我希望我正确地提出了这个问题 Thanks setInterval
  • 从 char* 初始化 std::string 而不复制

    我遇到一种情况 我需要处理大量 许多 GB 数据 如下所示 通过附加许多较小的 C char 字符串来构建一个大字符串 修剪绳子 将字符串转换为 C const std string 进行处理 只读 repeat 每次迭代中的数据都是独立的
  • 如何使对象通过拖动旋转,如何使用sin或cos获得围绕原点的旋转点?

    我已经搜索了很长时间 但找不到更好的方法来解决我的问题 使 div 可通过每个手柄拖动 旋转和调整大小 如这 2 个示例1 http vremenno net examples jquery ui rotation 2 http fabri
  • 从Superview 中删除不起作用

    我需要能够从视图中删除一个按钮并添加另一个按钮 我的代码如下所示 void UpdatePromoBanner NSString value button setTitle newer text forState UIControlStat
  • 如何根据“^P”分隔符分隔的数据构建 Hive 表

    我的查询是 CREATE EXTERNAL TABLE gateway staging poll int total int transaction id int create time timestamp update time time
  • Python 和 libstdc++ 的动态库问题

    执行摘要 Python 模块链接到不同版本的libstdc dylib比 Python 可执行文件 结果是调用iostream从模块崩溃 背景故事 我正在一台旧计算机 运行 10 5 8 上使用 SWIG 创建一个 Python 模块 由于
  • 链接到遗留库:-lgfortranbegin from a premade makefile

    我在尝试编译由一些研究人员开发的程序时遇到了一些麻烦 该程序应该以非常精确的方式计算傅立叶变换和其他一些有用的操作科学论文在这里 https www researchgate net profile Gerard Gomez2 public
  • 如何确定 Windows 10 上可执行二进制文件的体系结构

    给定一些Random exe在 Windows 上 我如何确定 它的CPU架构 例如Intel ARM 以及 它的位数 例如 32 或 64 我可以使用文件资源管理器 其他工具或编程方法中的属性吗 Cygwin https www cygw
  • 在 Node.js 中使用异步瀑布

    我有两个异步运行的函数 我想使用瀑布模型来编写它们 问题是我不知道怎么办 这是我的代码 var fs require fs function updateJson ticker value var stocksJson JSON parse