如何用代码说明Nod.Js异步队列
Admin 2022-08-16 群英技术资讯 1151 次浏览
本篇内容介绍了“如何用代码说明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) 或去执行结果.
上述列表实现过于简单, 可以做很多优化, 如队列大小控制, 互斥代码执行超时, 执行优先级等... 既然实现原理已表明, 锦上添花的功能就不在细化描述, 具体实现参考: AsyncQueue.
假定代码已经编写完善, 目录为 AsyncQueue. 下面记录发布 NPM 包步骤:
npm install 包名 --save 包介绍, 用法等, 可选.npm publish --access=public 即可.
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要是介绍JavaScript错误捕获的内容,下文有介绍基本使用与逻辑、JavaScript错误捕获特性、错误对象等等内容,对大家学习和理解JavaScript错误捕获有一定的帮助,那么接下来就跟随小编来学习一下吧。
这篇文章主要为大家详细介绍了vue+js实现微信上传图片选择功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文主要介绍了Vue3实现刷新页面局部内容的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
本文我们来了解vant的picker组件的基本用法,下文示例对大家学习picker组件的使用有一定的帮助,需要的朋友可以参考。另外,本文还介绍了vant-ui的Field输入框和Picker结合使用时,如何绑定正确的id类型的值的问题,感兴趣的朋友也可以了解看看。
想要制作一个轮播图我们要先弄清楚他的原理,如何能让图片自右向左滑动?轮播图是网页开发中经常见到的效果,购物网站,视频网站,社区论坛等等网站都会应用到,那么轮播图是如何制作的呢?首先,我们需要搞懂轮播图的实现原理,下面是让图片自右向左滑动的原理以及代码实现,感兴趣的朋友继续往下看吧。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008