在 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 中使用异步瀑布 的相关文章

  • 如何检测不渲染 .png 透明的浏览器

    我有这段代码可以根据一周中的某一天渲染图像 但在 IE6 及更低版本以及可能其他一些浏览器中 它不会呈现 png 不透明度 所以我想稍微改变一下 这样它就会检测到不渲染 alpha 透明度的浏览器 并告诉他们加载这个图像 img horar
  • 如何使用 AngularJS、Devise 和 UI Router 全局实现身份验证?

    我对 Angular 很陌生 所以这可能是一个新手问题 我正在尝试实现一个简单的任务管理器 只是一个练习 以 Rails 作为后端 以 Angular 作为前端 到目前为止 我遵循了教程 一切正常 现在我想在全球范围内实施身份验证 这意味着
  • 通过 AJAX 发送 XML

    我在 jQuery 中创建了一个 xml 文档 如下所示 var xmlDocument
  • 使用什么事件来在选择文本框中的值时显示警报消息

    我正在使用 jquery 的自动完成 api 来从数据库中获取名称 但是我想在从显示的文本框中选择名称时显示一条警报消息 我将显示一个图像以便更好地理解 当我输入 S 时 它将显示所有包含 S 的记录 所以问题是 如果我选择例如 Spars
  • 如何延迟 NavLink 的反应?

    Delay e gt e preventDefault setTimeout gt e unpreventDefault make this work 500 render
  • 从 JavaScript 将参数传递给 p:remoteCommand

    我想将值传递给remoteCommand来自 JavaScript 如果这是可能的 我该如何做到这一点以及如何在支持 bean 中接收它们 对的 这是可能的 如何执行此操作取决于 PrimeFaces 版本 你可以在PrimeFaces 用
  • 无法读取setInterval(Hooks)中的最新状态变量[重复]

    这个问题在这里已经有答案了 我想这是因为 JS 的工作原理 但我想你不会在类中遇到这个问题 在此代码中 let open setOpen React useState false let counter setCounter React u
  • 如何使用javascript隐藏div

    我想使用 Javascript 隐藏一个 div 下面是我的div div class ui dialog titlebar ui widget header ui corner all ui helper clearfix span cl
  • 无法从 Twin.macro 中的 Prop 获取值

    您可以在这里查看我正在尝试执行的操作的示例 https codesandbox io s vibrant leaf qj8vz https codesandbox io s vibrant leaf qj8vz 注意 这个特定的例子使用双宏
  • json、rails、javascript 中的解析错误

    我需要将 ruby 数组放入 javascript 数组中 但出现解析错误 var characters 这就是我将 ruby 嵌入到内联 javascript 中的方式 但它出现了解析错误 我应该如何将此 ruby 数组放入 javasc
  • 将 ESLint 与 Airbnb 样式和选项卡结合使用 (React.js)

    我正在开发一个 React js 应用程序 并且正在尝试检查我的代码 我将 ESLint 与 Airbnb 风格一起使用 但出现以下错误 src Test jsx 4 2 error Unexpected tab character no
  • 测量填写部分的时间 - 谷歌表单

    我正在尝试使用谷歌表单进行研究调查问卷 对于某些部分 我想自动测量用户填写所需的时间 谷歌表单中没有这样的选项 我尝试复制表单源 并用 javascript 填充时间 但它不起作用 跨源问题 未能成功托管复制的表单 如何做到 我如何衡量回答
  • 是否可以让 webpacks System.import 使用 ajax (用于进度事件)?

    所以我刚刚更新到 webpack 2 并进行了第一个工作设置 其中 webpack 通过查看 System import 调用自动创建块 相当甜蜜 但是 我使用 ajax 调用加载初始块 以便我可以加载时显示进度 https stackov
  • Node.js 中的startsWith:类型错误:未定义不是函数

    我在 Node js 中使用startsWith 时遇到错误 脚本sw js startswith var str Sein oder nicht sein dass ist hier die Frage console log str s
  • 如何在 JavaScript 中从代理对构造 UTF-16 字符?

    以下计算 Unicode 代码点的 UTF 16 代理对 戴着医用口罩的脸 https emojipedia org face with medical mask 但是如何从代理对构造字符以在字符串中使用呢 const codepoint
  • Axios GET 返回不可读的响应

    我有一个带有 axios 1 2 0 的简单 GET 的 Express 应用程序 const result AxiosResponse await axios get https jsonplaceholder typicode com
  • 在 React JSX 中返回配对元素

    问题 在 React 中 您希望通过映射数组来创建 DOM 结构 但数组中的每个项目应返回 2 个元素 例如 import React from react import from lodash let Component React ex
  • 右列固定的 Div 表

    我最近接手了一个非营利网站作为一个项目 我正在使用一个现有的网站 所以我必须使用很多已经编程的东西 所以我所要做的就是创建设计 I made a diagram of basically what I can t figure out ho
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • 将一维数组转换为二维数组[重复]

    这个问题在这里已经有答案了 我正在开发一个程序 我必须将文本文件中的值读入一维数组 我已经成功获取该一维数组中的数字 m1 1 2 3 4 5 6 7 8 9 但我希望数组是 m1 1 2 3 4 5 6 7 8 9 您可以使用此代码 co

随机推荐

  • 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