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概念进阶(同步/异步)的更多相关文章

  1. 03慕课网《进击Node.js基础(一)》API-URL网址解析

    url url.parse(url,query,host);解析域名 url必须,地址字符串 query可选 host 可选:在不清楚协议时正确解析 querystring 字符串和对象之间互相解析 ...

  2. 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 ...

  3. 10慕课网《进击Node.js基础(一)》初识promise

    首先用最简单的方式实现一个动画效果 <!doctype> <html> <head> <title>Promise animation</titl ...

  4. 07慕课网《进击Node.js基础(一)》HTTP小爬虫

    获取HTML页面 var http = require('http') var url='http://www.imooc.com/learn/348' http.get(url,function(r ...

  5. 进击Node.js基础(二)

    一.一个牛逼闪闪的知识点Promise npm install bluebird 二.Promise实例 ball.html <!doctype> <!DOCTYPE html> ...

  6. 02慕课网《进击Node.js基础(一)》——CommonJs标准

    是一套规范管理模块 每个js 为一个模块,多个模块作为一个包 node.js和Couchdb是对其的实现: 不同于jQuery 模块:定义.标识.引用(地址/模块名称) 模块类型: 核心模块http ...

  7. 进击Node.js基础(一)

    一.前言 1:Node.js本质上是用chrome浏览器 v8引擎 使用c++编写的JS运行环境 2:相比于JS没有浏览器安全级的限制,额外提供了一些系统级的API:文件读写,进程管理,网络通信等. ...

  8. node.js的作用、回调、同步异步代码、事件循环

    http://www.nodeclass.com/articles/39274 一.node.js的作用 I/O的意义,(I/O是输入/输出的简写,如:键盘敲入文本,输入,屏幕上看到文本显示输出.鼠标 ...

  9. 04慕课网《进击Node.js基础(一)》HTTP讲解

    HTTP:通信协议 流程概述: http客户端发起请求,创建端口默认8080 http服务器在端口监听客户端请求 http服务器向客户端返回状态和内容 稍微详细解析: 1.域名解析:浏览器搜素自身的D ...

随机推荐

  1. Mysql 安全登陆工具 mysql_config_editor

    mysql_config_editor 帮助信息请查看 man mysql_config_editor 或 mysql_config_editor -? 或 mysql_config_editor s ...

  2. Scala的控制结构和函数

    控制结构和函数 先看以下简单的一个条件表达式的demo object TestConditional { def main(args: Array[String]): Unit = { // scal ...

  3. Installation failed: Timeout was reached: Operation timed out after 10000 milliseconds with 0 out of 0 bytes received

    Trying this option worked for me. library(httr) with_config(use_proxy(...), install_github(...)) OR ...

  4. Ajax第一天——入门与基本概念

    什么是Ajax Ajax被认为是(Asynchronous JavaScript and XML的缩写).异步的js和xml 异步和同步:同步->类似打电话,接完一个再接下一个:异步:-> ...

  5. 数据增强利器--Augmentor

    最近遇到数据样本数目不足的问题,自己写的增强工具生成数目还是不够,终于在网上找到一个数据增强工具包,足够高级,足够傻瓜.想要多少就有多少!再也不怕数据不够了! 简介 Augmentor是一个Pytho ...

  6. 洛咕 P4131 [WC2005]友好的生物

    洛咕 P4131 [WC2005]友好的生物 首先可以发现\(C\)是没有用的,可以乘进所有的权值里面做 考虑没有最后一维的限制,那么两个生物的友好值就是 \(\sum_{i=1}^k|a_i-b_i ...

  7. 传输层tcp协议以及scoket套字节方法

    一.传输层 1.传输层的由来: 网络层的IP帮我们区分子网 以太网的Mac帮我们找到主机 所以通过IP和Mac找到了一台特定的主机 如何找到该特定主机的应用程序呢? 答案是通过端口,端口即应用程序与网 ...

  8. Design2:使用HierarchyID构建数据的分层结构

    1,传统的分层结构是父子结构,表结构中有一个ParentID字段自引用表的主键,表示“归属”关系,例如 create table dbo.emph ( ID int not null primary ...

  9. Mysql优化之索引

    前言 这几天抽了个时间将<高性能Mysql>看了一下忽觉索引非常之重要,习之然后总结巩固知识.本文索引使用的是InnoDB存储引擎.因为本文并不是说用索引的好处,所以并不会书写QPS之类的 ...

  10. A* 寻路的八个变种

    变种 1 - 束搜索(Beam Search) 在 A* 算法的住循环中,OPEN 集存储可能需要搜索的节点,用来以查找路径. 束搜索是 A* 的变体,它限制了OPEN集的大小. 如果集合变得太大,则 ...