05慕课网《进击Node.js基础(一)》HTTP概念进阶(同步/异步)
HTTP模块介绍
支持http协议的更多特性
不缓存请求和响应
API比较底层处理流相关,信息解析
HTTP相关概念
回调
将函数作为参数传到执行函数中,参数函数在执行函数中嵌套执行
function learn(something){
console.log(something);
} function we(callback,something){
something+=' is cool'
callback(something)
}
//具名函数
we(learn,'Nodejs')
//匿名函数
we(function(something){
console.log(something)
},'hello')
同步/异步
JavaScript中的异步函数
//在指定间隔内执行一次
setTimeout(function(){
alert('1')
},2000)
//在执行间隔内重复执行,但是需要关闭alert,不会弹出N个
setInterval(function(){
alert('1')
},2000)
同步
任务顺序执行,等待上一个执行完成再执行下一个
//同步
var c=0
function print(){
console.log(c)
} function plus(){
setTimeout(function(){
console.log('aaa')
},1000)
c+=1;
}
plus()
print()
异步
setTimeout()不只是是一个异步函数,它还涉及到了计时器线程
多个setTimeout()函数首先按照先后顺序压入异步函数队列中
主程序执行完毕后开始执行异步函数队列
异步队列中若是setTimeout函数,则放到计时器线程中
在计时器线程中,如果时间相等,则按进入线程的先后顺序执行
若有A,B线程,A正在执行,但是B已经到了该执行的时间,那么B不会执行,直到等待A执行完毕才会执行
若异步队列中有需要立即执行的函数,那么久首先执行,A会等待,一次只执行一个
或者是setTimeout()函数首先放到计时器线程当中,等到指定的时间放入执行队列当中
每个任务都有多个回调函数,前一个任务执行完毕后不执行下一个任务,而是执行回调函数;后一个任务按照任务的排列顺序执行,不会等待上一个任务执行完毕
//异步,任务执行完成后执行回调函数
var c=0
function print(){
console.log(c)
} function plus(callback){
setTimeout(function(){
c+=1;
callback()
},1000)
console.log('a')
}
plus(print)
有关异步的一个问题:https://www.jianshu.com/p/e5225ba4a025
参考闭包:http://www.jb51.net/article/24101.htm
//以下代码的输出是什么?如何修改
for (var i = 1; i <= 5; i++) {
setTimeout( function(){ //function timer()可以是具名函数
console.log(i);
},i*1000);
}
//输出5个6:6 6 6 6 6 6
//因为setTimeou函数是异步的,在正文执行完后,i=6的时候开始执行,而且是执行5次,所以打印5个6
错误答案:
for (var i = 1; i <= 5; i++) {
setTimeout( function(i){ //function timer()可以是具名函数
console.log(i);
},i*1000);
} //输出5 个 undefined;调用匿名函数,没有传值,i引用的是参数i的值,i为undefined
正确答案一:
for (var i = 1; i <= 5; i++) {
(function() {
var j = i;
setTimeout( function() {
console.log(j);
},i*1000 ); //这一行将i*1000改为j*1000也行,并不影响
})();
}
//此处用了立即执行函数(function(){})();使setTimeout中函数形成了闭包
//什么是闭包:当内部函数(setTimeout中的匿名函数) 在定义它的作用域(立即执行函数) 的外部(立即执行函数外部) 被引用时(异步,最后调用,在外部调用)
// 就创建了该内部函数(匿名函数)的闭包
// 如果内部函数(匿名函数)引用了位于外部函数的变量,当外部函数调用完毕后,这些变量在内存不会被 释放,因为闭包需要它们. //根据闭包的定义,我们面对这个问题的思路:
// 匿名函数function(){ console.log(j) }外要再套一层立即执行函数
// j为引用立即执行函数中的变量
// 通过异步调用匿名函数
正确答案二:使用let块级作用域形成闭包,不太了解就不说了
for (var i = 1; i <= 5; i++) {
let j = i;
setTimeout(function timer() {
console.log(j);
},j*1000);
}
归纳一下就是:函数里面有函数,函数外面调用里面函数;但是函数外面怎么调用函数里面的函数呢?
1.使用异步,异步是最后执行;上面的例子是这样
2.该函数的结果为里面的函数,先var fn=该函数,然后执行fn,这样就形成了闭包
I/O
磁盘上数据读写
单线程/多线程
一次只能进行一个请求和响应
多个请求和响应同时进行
阻塞/非阻塞
阻塞:客户端一直等待服务端响应
非阻塞:请求无响应就去干别的,过段时间再请求
事件
点击,移动等操作
事件驱动
函数在事件发生的时候执行
基于事件驱动的回调
函数中的回调函数
事件循环
密集任务异步执行放到loop队列,单线程不断查询loop队列
05慕课网《进击Node.js基础(一)》HTTP概念进阶(同步/异步)的更多相关文章
- 03慕课网《进击Node.js基础(一)》API-URL网址解析
url url.parse(url,query,host);解析域名 url必须,地址字符串 query可选 host 可选:在不清楚协议时正确解析 querystring 字符串和对象之间互相解析 ...
- 01慕课网《进击Node.js基础(一)》Node.js安装,创建例子
版本:偶数位为稳定版本,基数为非稳定版本 - 0.6.x - 0.7.x - 0.8.x -0.9.x -0.10.x -0.11.x 概念:Node.js采用谷歌浏览器的V8引擎,用C ...
- 10慕课网《进击Node.js基础(一)》初识promise
首先用最简单的方式实现一个动画效果 <!doctype> <html> <head> <title>Promise animation</titl ...
- 07慕课网《进击Node.js基础(一)》HTTP小爬虫
获取HTML页面 var http = require('http') var url='http://www.imooc.com/learn/348' http.get(url,function(r ...
- 进击Node.js基础(二)
一.一个牛逼闪闪的知识点Promise npm install bluebird 二.Promise实例 ball.html <!doctype> <!DOCTYPE html> ...
- 02慕课网《进击Node.js基础(一)》——CommonJs标准
是一套规范管理模块 每个js 为一个模块,多个模块作为一个包 node.js和Couchdb是对其的实现: 不同于jQuery 模块:定义.标识.引用(地址/模块名称) 模块类型: 核心模块http ...
- 进击Node.js基础(一)
一.前言 1:Node.js本质上是用chrome浏览器 v8引擎 使用c++编写的JS运行环境 2:相比于JS没有浏览器安全级的限制,额外提供了一些系统级的API:文件读写,进程管理,网络通信等. ...
- node.js的作用、回调、同步异步代码、事件循环
http://www.nodeclass.com/articles/39274 一.node.js的作用 I/O的意义,(I/O是输入/输出的简写,如:键盘敲入文本,输入,屏幕上看到文本显示输出.鼠标 ...
- 04慕课网《进击Node.js基础(一)》HTTP讲解
HTTP:通信协议 流程概述: http客户端发起请求,创建端口默认8080 http服务器在端口监听客户端请求 http服务器向客户端返回状态和内容 稍微详细解析: 1.域名解析:浏览器搜素自身的D ...
随机推荐
- linux iSCSI target/initiator配置
linux iSCSI target配置全过程一:Install iSCSI target for Linux1,操作系统:[root@rac2 ~]# cat /etc/issueEnterpris ...
- CTF-i春秋网鼎杯第四场部分writeup
CTF-i春秋网鼎杯第四场部分writeup 因为我们组的比赛是在第四场,所以前两次都是群里扔过来几道题然后做,也不知道什么原因第三场的题目没人发,所以就没做,昨天打了第四场,简直是被虐着打. she ...
- 20155236范晨歌_exp6信息搜集与漏洞扫描
20155236范晨歌_exp6信息搜集与漏洞扫描 目录 实践目标 信息搜集 漏洞扫描 总结 实践目标 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口 ...
- mfc 控制台程序
自动生成的C++控制台程序 认识预编译头 认识_tmain 一 .自动生成的控制台程序 二 .认识预编译头 StdAfx 所谓的预编译头就是把一个工程中的某一部分代码,预先编译好放在一个文 ...
- 1、算法介绍,lowB三人组,快速排序
1.什么是算法 2.递归 # 一直递归,递归完成再打印 def func4(x): if x > 0: func4(x - 1) print(x) func4(5) 3.时间 复杂度 (1)引入 ...
- 4710: [Jsoi2011]分特产
4710: [Jsoi2011]分特产 链接 分析: 容斥原理+隔板法. 代码: #include<cstdio> #include<algorithm> #include&l ...
- 牛客网NOIP赛前集训营-提高组(第六场)B-选择题[背包]
题意 题目链接 分析 直接背包之后可以 \(O(n)\) 去除一个物品的影响. 注意特判 \([p==1]\) 的情况. 总时间复杂度为 \(O(n^2)\) . 代码 #include<bit ...
- Object C学习笔记1-基本数据类型说明
Objective-C数据类型可以分为:基本数据类型.对象类型和id类型.基本数据类型有:int.float.double和char类型.对象类型就是类或协议所声明的指针类型,例如:NSAutorel ...
- 【ASP.NET Core】运行原理(2):启动WebHost
本系列将分析ASP.NET Core运行原理 [ASP.NET Core]运行原理[1]:创建WebHost [ASP.NET Core]运行原理[2]:启动WebHost [ASP.NET Core ...
- Macaca上手体验
在研究了一段时间Appium后,尝试对另一个框架做实验——Macaca,阿里的开源测试框架,该框架不只适合移动端,同样适用于web端,可谓是方便的很啊~ 同时支持js.java.python.封装好的 ...