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 ...
随机推荐
- Web安全0002 - SQL注入 - 注入流程
注:本文是学习网易Web安全进阶课的笔记,特此声明. 一.信息搜集 — 数据库类型 - 报错信息.特有语句— 数据库版本(@@version,$version)— 数据库用户— 判断数据库权限 二.数 ...
- R语言学习笔记(十八):零碎知识点46-50
seq_along与seq_len函数的使用 在for循环中有用 > seq_along(c(2,3,5)) [1] 1 2 3 > seq_len(3) [1] 1 2 3
- 批量分离SQL数据库语句
--sp_helpdb--查看可用数据库 declare @name sysname, @sql nvarchar(4000) DECLARE roy CURSOR FOR --排除不分离的数据库名就 ...
- 2017-2018-1 20155336 《信息安全系统设计基础》加分作业:实现mypwd
2017-2018-1 20155336 <信息安全系统设计基础>加分作业:实现mypwd 什么是PWD? 用man pwd查看: 用于打印当前工作目录的工作路径 1.命令格式:pwd[选 ...
- linux用户管理(1)----创建用户(adduser和useradd)和删除用户(userdel)
一.常用命令: (1)创建用户命令两条: adduser useradd (2)用户删除命令: userdel 二.两个用户创建命令之间的区别 adduser: 会自动为创建的用户指定主目录.系统sh ...
- [Windows]_[中级]_[崩溃报告的中级解决方案]
场景 1.在Windows上用C/C++开发软件, 经常会出现软件级别的崩溃情况, 如果用户看到这种崩溃报告, 那么一般会认为软件质量不高, 从而不想用. Windows上就会有崩溃报告这种噢给你工具 ...
- C++STL学习笔记_(2)deque双端数组知识
#include<iostream> using namespace std; #include "deque" #include "algorithm&qu ...
- PLSQL Developer 客户端没有TNS监听,无法连接数据库
在Windows Server 2008 中安装了 64位的Oracle,好不容易将监听做好,在使用客户端 PLSQL Developer 的时候发现竟然没有TNS监听. 问题如下: 如上图所示,打开 ...
- jQuery瀑布流详解(PC及移动端)
前言 瀑布流布局已成为当今非常普遍的图片展示方式,无论是PC还是手机等移动设备上.这种布局图片的样式大概分为三种:等高等宽.等宽不等高.等高不等宽,接下来我们就最为普遍的等宽不等高形式来作为示例. 我 ...
- CSS动画transform、transition和animation的区别
CSS3属性中关于制作动画的三个属性:Transform,Transition,Animation. 1.transform:描述了元素的静态样式,本身不会呈现动画效果,可以对元素进行 旋转rotat ...