05慕课网《进击Node.js基础》HTTP概念进阶

Posted 言凡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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概念进阶的主要内容,如果未能解决你的问题,请参考以下文章

08慕课网《进击Node.js基础》事件events

06慕课网《进击Node.js基础》作用域和上下文

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

慕课网学习node.js

Node.js爬虫-爬取慕课网课程信息

慕课网视频破解付费分享-前端开发-Python等