首页前端开发JavaScript深入了解Node.js中的异步编程,分享四种解决方案

深入了解Node.js中的异步编程,分享四种解决方案

时间2024-01-30 07:51:02发布访客分类JavaScript浏览759
导读:收集整理的这篇文章主要介绍了深入了解Node.js中的异步编程,分享四种解决方案,觉得挺不错的,现在分享给大家,也给大家做个参考。有异步I/O,必有异步编程!今天来学习Node.js里的异步编程!异步编程概述曾经的单线程模型在同步I/O的影...
收集整理的这篇文章主要介绍了深入了解Node.js中的异步编程,分享四种解决方案,觉得挺不错的,现在分享给大家,也给大家做个参考。有异步I/O,必有异步编程!今天来学习Node.js里的异步编程!

异步编程概述

曾经的单线程模型在同步I/O的影响下,由于I/O调用缓慢,在应用层面导致CPU与I/O无法重叠进行。为了照顾编程人员的阅读思维习惯,同步I/O盛行了很多年。【推荐学习:《nodejs 教程》】

但是有很大的性能问题!

Node利用JavaScript及其内部异步库,将异步直接提升到业务层面。Node带来的最大特性莫过于基于事件驱动的非阻塞I/O模型。非阻塞I/O可以使CPU与I/O并不相互依赖等待,让资源得到更好的利用。

异步编程解决方案

目的:读取package.JSON 中main 字段对应的文件内容

Callback

使用回调函数进行异步I/O的操作

const fs = require("fs");
fs.reaDFile("./package.json", {
 encoding: "utf-8" }
    , (err, data) =>
 {
      if (err) throw err;
  const {
 main }
     = JSON.parse(data);
  fs.readFile(main, {
 encoding: "utf-8" }
    , (err, data) =>
 {
        if (err) throw err;
        console.LOG(data);
  }
    );
}
    );
    

问题:如何解决回调地狱?

Promise

PRomise是一个具有四个状态的有限状态机,其中三个核心状态为PEnding(挂起),Fulfilled(完成)、Rejected(拒绝),以及还有一个未开始状态

详细内容可以看我之前的博文 Promise初探

使用Promise,实现读取 package.json 中 main 字段对应的文件内容

const {
 readFile }
     = require("fs/promises");
readFile("./package.json", {
 encoding: "utf-8" }
    )  .then((res) =>
 {
        return JSON.parse(res);
  }
    )  .then((data) =>
 {
    return readFile(data.main, {
 encoding: "utf-8" }
    );
  }
    )  .then((res) =>
 {
        console.log(res);
  }
    );
    

对比之前用Callback的解决方案,可以看出没有嵌套的回调了,通过一系列的链式调用来处理异步操作。

Callback 转为 Promise

如何将 Callback 转为 Promise 形式?

可以使用Node自带的工具函数 util.promisify

可以自己实现一下:

function promisify(fn, receiver) {
      return (...args) =>
 {
        return new Promise((resolve, reject) =>
 {
          fn.apply(receiver, [        ...args,        (err, res) =>
 {
              return err ? reject(err) : resolve(res);
        }
    ,      ]);
    }
    );
  }
    ;
}
    const readFilePromise = promisify(fs.readFile, fs);
    

awaIT

await 函数使用 try catch 捕获异常(注意并行处理)

const {
 readFile }
     = require("fs/promises");
    const start = async () =>
 {
  const {
 main }
 = JSON.parse(    await readFile("./package.json", {
 encoding: "utf-8" }
    )  );
  const data = await readFile(main, {
 encoding: "utf-8" }
    );
      console.log(data);
}
    ;
    start();
    

await的语法写起来就像同步编程一样,这里的操作是串行操作,会一行一行的等待执行。

如果几个任务是可以并行的,这样写就不太好了。这是,我们可以使用Promise.all来操作并行的任务

这里也会有个小问题,我课后问老师了,这是老师的解答

【问】在异步那块,说到串行和并行,在并行处理那块我有一个疑问。如果并行的场景要求:不管其他任务执行成功还是失败,每个异步任务都要执行完,最后统一处理错误,那在用Promise.all来处理多个异步任务时候,遇到第一个任务执行错误的时候就会返回,如何操作才能让所有任务都执行完成,再统一处理错误呢

【答】Promise.all 处理多个请求,当所有请求都成功的时候,resolve 一个数组回来,里面是执行结果。如果有一个请求失败就立刻 reject 那个错误来,所以这个地方我们不能使用 Promise.all 来实现。Promise 有一个 allSeTTLed 方法,developer.mozilla.org/en-US/docs/…

Event

发布订阅模式,Node.js 内置events 模块

比如HTTP server on('request') 事件监听

const EventEmitter = require("events");
class MyEmitter extends EventEmitter {
}
    const myEmitter = new MyEmitter();
    myEmitter.on("event", () =>
 {
      console.log("an event occurred!");
}
    );
    myEmitter.emit("event");
    const http = require("http");
    const server = http.createServer((req, res) =>
 {
      res.end("hello!!! this is YK!!!");
}
    );
    server.on("request", (req, res) =>
 {
      console.log(req.url);
}
    );
    server.listen(3000);
    

原文地址:https://juejin.cn/post/7005509871000895524

作者:YK菌

更多编程相关知识,请访问:编程视频!!

以上就是深入了解Node.js中的异步编程,分享四种解决方案的详细内容,更多请关注其它相关文章!

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!

上一篇: 15个值得收藏的实用JavaScript代...下一篇:快速了解Angular中的onPush变更检...猜你在找的JavaScript相关文章 html font标签如何设置字体大小?html font标签属性用法介绍2022-05-16vue3+TypeScript+vue-router的使用方法2022-04-16vue3获取当前路由地址2022-04-16如何利用React实现图片识别App2022-04-16JavaScript展开运算符和剩余运算符的区别详解2022-04-16微信小程序中使用vant框架的具体步骤2022-04-16Vue elementUI表单嵌套表格并对每行进行校验详解2022-04-16如何利用Typescript封装本地存储2022-04-16微信小程序中wxs文件的一些妙用分享2022-04-16JavaScript的Set数据结构详解2022-04-16 其他相关热搜词更多phpjavapython程序员loadpost-format-gallery

若转载请注明出处: 深入了解Node.js中的异步编程,分享四种解决方案
本文地址: https://pptw.com/jishu/592243.html
Asp.net MVC 对输入的字符串字段做Trim处理的方法 解决 ASP.NET Core MySql varchar 字符串截取实例教程

游客 回复需填写必要信息