异步控制之 Bagpipe
Bagpipe朴大的bagpipe感觉是比async的解决方案好用一些。基本思路:
通过队列来控制并发量。
如果当前队列活跃(调用发起但未执行回调)的异步调用量小于限定值,从队列中取出执行。
如果活跃调用达到限定值,调用暂时存放在队列中。
每个异步调用结束时,从队列中取出新的异步调用执行。123456789101112131415161718192021222324 var Bagpipei = require('bagpipe'); //设置最大并发数为 10 var bagpipe = new Bagpipe(10,{ refuse:true; //拒绝模式 timeout:3000; //超时控制 超时时间为3000ms }); for(var i = 0 ; i < 100; ++i){ bagpipe.push(async,function(){ }); }````- 拒绝模式下:如果等待的调用队列也满了之后,新来的调用就直接返回给它一个队列太忙的拒绝异常。- 超时模式下:异 ...
异步编程之async、step。。
异步的解决方案,主要了解一下async、step加上一个比较奇葩的wind应该足够了。实在不行还可以写恶魔金字塔嘛。
async安装引用
1var async = require('async');
1.series()
12345678910async.series([ function(callback){ fs.readFile('file1.txt','utf-8',callback); }, function(callback){ fs.readFile('file2.txt','utf-8',callback); },],function(err,results){ //results => [file1.txt,file2.txt]});
这段代码等价于
1234567891011fs.readFile('file1.txt','utf-8',function(er ...
理解promise
promise的基本理解
es6原生支持Promise对象
Promise 是一个容器,里面保存着某个未来才会结束的事件
Promise 对象不受外界影响,它代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)、rejected(已失败)。只有异步操作的结果能是状态发生改变。并且状态一旦改变就不能不能在变化。状态的改变只有两种可能:从pending——>fulfilled/rejected。
基本用法123456789const promise = new Promise(function(resolve, reject) { // ... some code if (/* 异步操作成功 */){ resolve(value); } else { reject(error); }});
Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。它们是两个函数,由 JavaScript 引擎提供,不用自己部署。resolve函数的作 ...
promise中的reject和catch处理上的区别
reject 和 catch 的处理上123456auto.getData().then(function (results) { res.send(results);}, next);auto.getData().then(function (results) { res.send(results);}).catch(next);
第一种写法,next函数只会处理getData中的reject时的异常情况。
第二种写法,catch会捕捉到在它之前的promise链上的代码抛出的异常,不仅仅是getData,还有then()里面的异常。
---
好吧看到了就整理搬运过来了,免得到时候找不到了 orz
require的实现原理
几乎所有Node.js开发人员都可以告诉你这个require()函数的作用,但是我们中有多少人真的知道它是如何工作的?我们每天都使用它来加载库和模块,但它的行为却是一个谜。好奇,我挖掘了Node核心,了解幕后发生了什么。但是,我没有找到单一功能,而是成为Node模块系统的核心:module.js。该文件包含一个令人惊讶的功能但相对未知的核心模块,它控制所使用的每个文件的加载,编译和缓存。require()事实证明,这只是冰山一角。MODULE.JS12345function Module(id, parent) { this.id = id; this.exports = {}; this.parent = parent; // ...
找到的Module类型在module.jsNode.js 中有两个主要角色。首先,它为所有Node.js模块的构建提供了基础。每个文件在加载时都会获得此基本模块的新实例,即使在文件运行后也会持续存在。这就是为什么我们可以module.exports根据需要附加属性并在以后返回它们。该模块的第二项重要工作是处理Nod ...
毕业了,致终将逝去的青春
好不容易休一天假,旧的博客还没迁移完。休息之余,传一波照片。(皮一下 =.=)
关于闭包
这篇文章是2018-06-26号创建的,那个时候我接触到了闭包,然后写下了自己的理解。2019年的时候我编辑过一次。因为自己对闭包有了新的理解。。
现在我看了《你不知道的JavaScript》这本书的上卷后,删除了之前编辑的内容。准备重新分享我对闭包的理解。
词法作用域词法作用域,又叫静态作用域。
说道词法作用域就要提一下编译的三个阶段:
词法分析
语法分析
代码生成
而词法作用域就是在词法分析阶段确定的,换句话说就是你在写代码时将变量放在哪个代码块里来决定。
看这样一段代码:
123456var a = 100function foo(){ var a = 20; console.log(a)}foo() // 20
稍微有点JavaScript基础的同学都知道,输出为什么是20。
作用域发生嵌套时,引擎会从当前作用域往外层逐层查找,就和前端的click事件冒泡一样。
什么是闭包我印象里的关于闭包的定义有很多:
一个函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包(cl ...
深拷贝和浅拷贝
栈和堆stack为自动分配的内存空间,它由系统自动释放;而heap则是动态分配的内存,大小不定也不会自动释放。基本类型和引用类型
基本类型:存放在栈内存中的简单数据段,数据大小确定,内存空间大小可以分配。5种基本数据类型有Undefined、Null、Boolean、Number 和 String,它们是直接按值存放的,所以可以直接访问。
引用类型:存放在堆内存中的对象,变量实际保存的是一个指针,这个指针指向另一个位置。每个空间大小不一样,要根据情况开进行特定的分配。当我们需要访问引用类型(如对象,数组,函数等)的值时,首先从栈中获得该对象的地址指针,然后再从堆内存中取得所需的数据。
传值与传址前面之所以要说明什么是内存中的堆、栈以及变量类型,实际上是为下文服务的,就是为了更好的理解什么是“浅拷贝”和“深拷贝”。基本类型与引用类型最大的区别实际就是传值与传址的区别。测试用例:12345678910var a = [1,2,3,4,5]; var b = a; var c = a[0]; alert(b);//1,2,3,4,5 alert(c);//1 //改变数 ...
javaScript基础问题
ps:在社区找了个某大型互联网公司面试题,对比着知识点顺便把原来的服务器上的博客迁移过来 =.=!类型判断区分 js 中的undefined ,null ,“” , 0 和 false等….根据大佬推荐 其实应该去阅读loadsh的源码。小白表示暂时不看,以后再看。
凭自己理解分析一下:
123456789<script>alert(!0); //truealert(!false); //truealert(!undefined); //truealert(!null); //truealert(!''); //true</script>
######首先,通过上面的代码可以知道 , 在if..else 循环中, 0、false、undefined、null、’’ 都是会进入else块的,也就是说:
12345678910Boolean(0)falseBoolean(false)falseBoolean(undefined)falseBoolean(null)falseBoolean('')false
如上代码所示, ...
路漫漫其修远兮,吾将上下而求索!
如题无人与我立黄昏,无人问我粥可温。无人与我捻熄灯,无人共我书半生。无人陪我夜已深,无人与我把酒分。无人拭我相思泪,无人梦我与前尘。无人陪我顾星辰,无人醒我茶已冷。无人听我述衷肠,无人解我心头梦。无人拘我言中泪,无人愁我独行路。回首向来萧瑟处,无人等在灯火阑珊处。愿与执手立黄昏,愿与品茗粥尚温。愿与添香捻熄灯,愿与捧卷书半生。愿与剪烛夜已深,愿与对弈把酒分。愿与叠袖相拭泪,愿与入梦共前尘。愿与赏月顾星辰,愿与烹茶清未冷。愿与静听诉衷肠,愿与话君心头梦。愿与解语心中泪,愿与共行天下路。回首灯火阑珊处,那人一如初见立中宵。