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 ...
随机推荐
- Twenproxy介绍
1 Twenproxy介绍 Twemproxy是为memcached或者Redis集群提供一个高速.轻量级代理服务.它的主要用途是降低对缓存server打开的连接数.它的主要特性例如以下: l 保持 ...
- nodeJs搭建简单服务器
实现简单的例子:hello word 把第一个文件命名为server.js 在server.js里写入 var http = require("http"); http.crea ...
- CCF认证201712-2游戏
问题描述 有n个小朋友围成一圈玩游戏,小朋友从1至n编号,2号小朋友坐在1号小朋友的顺时针方向,3号小朋友坐在2号小朋友的顺时针方向,……,1号小朋友坐在n号小朋友的顺时针方向. 游戏开始,从1号小朋 ...
- C++ 容器类型成员
类型别名 iterator 此容器类型的迭代类型 const_iterator 可以读取元素,但不能修改元素的迭代器类型 size_type 无符号整数类型,足够保存此种容器类型最大可能容器的大小 ...
- jQuery 事件函数传参异常identifier starts immediately after numeric literal
问题情境: var arr=[aabbcc,112233]; var html = ""; for(var i =0;i<arr.length;i++){ html += ' ...
- 20145202马超 2016-2017-2 《Java程序设计》第9周学习总结
20145202马超 2016-2017-2 <Java程序设计>第9周学习总结 教材学习内容总结 JDBC 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交 ...
- cogs1685 【NOI2014】魔法森林 Link-Cut Tree
LCT练手好题啊. SPFA的做♂FA是把边按照a排序,然后加一条权值为b的边跑SPFA,不断更新答案.很好的做♂FA,但复杂度无♂FA保证. LCT的做♂FA类似,也是把边按照a排序,然后也是加一条 ...
- 菜鸟vimer成长记——第3章、文件
上一章一直在讲的是vim的文本的操作,本章主要讲的是vim的文件操作. 本章的有些概念和传统的文本编辑器也不尽相同.所以需要注意概念或者切切说是思维习惯的区别. vim 允许在一个编辑会话中编辑多个文 ...
- ASP.NET Application Life Cycle
The table in this topic details the steps performed while an XAF ASP.NET application is running. Not ...
- SQL语句汇总(终篇)—— 表联接与联接查询
既然是最后一篇那就不能只列出些干枯的标准语句,更何况表联接也是SQL中较难的部分,所以此次搭配题目来详细阐述表联接. 上一篇博文说到相关子查询效率低下,那我们怎么能将不同表的信息一起查询出来呢?这就需 ...