如何用代码说明Nod.Js异步队列

Admin 2022-08-16 群英技术资讯 469 次浏览

本篇内容介绍了“如何用代码说明Nod.Js异步队列”的有关知识,在实际项目的操作过程或是学习过程中,不少人都会遇到这样的问题,接下来就让小编带大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!


NodeJs 程序并没有锁概念, 可能是单线程程序的缘故吧. 但是存在异步回调, 也就造成并发执行统一代码的可能性, 当然这里并发不是真正意义上的并发. 是同一线程在不同时间点执行统一代码. 事故类似代码如下:

// 阻塞函数
const sleep = async (ms = 0) => {
	return new Promise((resolve, reject) => {
		return setTimeout(resolve(true), ms);
	})
}

let total = 0;
const demoFunc = async () => {
    let count = total;
    await sleep(2000)
    total = count + 1;
}

demoFunc();
demoFunc();
sleep(4000);
console.log(total); // 输出 1

示例是一个很简单的自增行为, 很多人可能会说直接在demoFunc()前加 await 不是就是期望结果了, 然后事实可能是真的无法直接这样做, demoFunc 函数代表其实是一个web请求的处理. total 是数据读存(db 或 file).
我期望的结果是 2, 实际结果却为 1. 具体情况不同可能有不同解决方案, 本文提供一种异步队列机制去顺序执行需要互斥的的代码.

最简单的互斥执行

只用使用 Promise 链执行顺序执行互斥代码.

let queue = Promise.resolve(true);

const queue_exec = async (fn) => {
    queue = queue.then(() => {
        try {
            return Promise.resolve(fn());
        } catch(err) {
            return Promise.reject(err);
        }
    });
    return queue;
}

// 上述示例换成如下调用即可
queue_exec(demoFunc);  // 在实际的请求中可以用 await queue_exec(demoFunc) 或去执行结果.

完善包装成 NPM 包

上述列表实现过于简单, 可以做很多优化, 如队列大小控制, 互斥代码执行超时, 执行优先级等... 既然实现原理已表明, 锦上添花的功能就不在细化描述, 具体实现参考: AsyncQueue.

假定代码已经编写完善, 目录为 AsyncQueue. 下面记录发布 NPM 包步骤:

  1. cd AsyncQueue # 进入代码目录
  2. npm init # npm 初始化 进入交互模式, 可以一路按回车, 最终生成 package.json 文件
  3. npm login # 登录 NPM 官网, 交互输入 npmjs.com 网站的用户名密码
  4. 编辑 package.json 修改相关字段
    • name 包名, 不支持大写, 而且极易与存在的包名冲突, 可以通过 @用户名/包名 格式做为包名, 避免冲突, 缺点就是包名很长.
    • main 入口文件名, 指定 require(包名) 需要加载到文件名
    • version 包版本
    • 其它字段按需修改即可
  5. 编写 README.md 文件, 如包安装 npm install 包名 --save 包介绍, 用法等, 可选.
  6. npm publish --access=public # 发布包, --access=public 显示发布公开包
  7. 变更完成, 更新 package.json 中 version 字段, 重新发布 npm publish --access=public 即可.

上述内容具有一定的借鉴价值,感兴趣的朋友可以参考,希望能对大家有帮助,想要了解更多"如何用代码说明Nod.Js异步队列"的内容,大家可以关注群英网络的其它相关文章。 群英智防CDN,智能加速解决方案
标签: Nod.Js异步队列

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

猜你喜欢

成为群英会员,开启智能安全云计算之旅

立即注册
专业资深工程师驻守
7X24小时快速响应
一站式无忧技术支持
免费备案服务
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
在线客服
微信公众号
返回顶部
返回顶部 返回顶部
在线客服
在线客服