异步编程与包资源管理
一:异步编程:
(1):概念:
同步:即下晚自习,洗澡,上床,看微博,看小说,看博客,睡觉。(是分步执行的).
异步:一边走路,一边把早餐也吃了。
代码:异步.js;
console.log("起床"); console.log("涮牙"); function eatBreakfasst() { console.log("开始吃早餐"); setTimeout(function (){ console.log("走路"); },3000); //3s setTimeout(function(){ console.log("早餐吃完了"); },2000); //2s } eatBreakfasst(); console.log("还是迟到了"); //setTimeout()是一个异步函数,在指定的时间后执行内部的函数. //观察代码可以发现setTimeout是一个异步函数.s
输出:
二:回调函数:
(1):概念:回调函数是指函数可以被传递到另一个函数中,然后被调用的形式。(通过传送函数的地址。)。
function test(x) { return JSON.parse(x); } try { var obj = test('foo'); console.log(obj); } catch(e){ //e指向捕获到的额错误; console.log("转换失败"); }
输出:
E:\Program Files\Sublime Text 3>node 回调函数.js
转换失败
(2):在异步编程中不可以使用try...catch。想想就知道了,异步和同步的执行区别是一个同时执行一个分步依次执行。
错误和发现错误不能同时发生或者在异步中我们不知道到底谁先发生。总之:使用try...catch不能捕获setTimeout()函数中出现的异常。
代码:捕获异步.js
function test(x) { setTimeout(function(){ return JSON.parse(x); },0) } try{ var obj = test('foo'); console.log("执行结果是"+obj); } catch(c) { console.log("转换失败了"); }
输出:
E:\Program Files\Sublime Text 3>node 捕获异步.js
执行结果是undefined
undefined:1
foo
^
SyntaxError: Unexpected token o in JSON at position 1
at JSON.parse (<anonymous>)
at Timeout._onTimeout (E:\Program Files\Sublime Text 3\捕获异步.js:4:13)
at listOnTimeout (internal/timers.js:531:17)
at processTimers (internal/timers.js:475:7)
2:把错误代码写在setTimeout()代码中:
.
function test(x) { setTimeout(function(){ try { return JSON.parse(x); } catch(e) { console.log('转换失败'); } },0); } var obj = test('foo'); console.log("执行结果是:"+obj);
输出:
转换失败
3:回调函数即当使用异步代码去做一件事时,不能预测这件事什么时候做完,其他的事情还在继续,这时可给异步代码准备一个包裹,当异步代码有了执行结果时可以将结果放到这个包裹里,需要在哪里使用这个结果就从包裹取出。
function test(str,callback) { setTimeout(function(){ try { var obj = JSON.parse(str); callback(null,obj); } catch(e) { callback(e,null); } },0); } test('foo',function(err,result){ if(err) { return console.log('转换失败了'); } console.log('数据转换成功,没有问题可以直接使用了:'+result); });
输出:
E:\Program Files\Sublime Text 3>node 回调函数1.js
转换失败了
二:NPM:全称:Node.js Package Manage。NPM网址为https://www.npmjs.com,该网站是全球最大的模块生态系统,里面所有的包都是通过Node.js实现的,开源免费,即查即用。
(1):包的概念:像集成电路一样,包封装了特一的功能,Node.js的包和模块并没有本质的不同,包是在模块的基础上更进一步的组织JavaScript代码的目录。每个包都会有一个接口,我们只要拿到这个接口就能使用这个包了,还有node.js包遵循CommonJS规范。
(2):NPM:命令行操作:也可以直接去网上下载。
npm install 包名/npm uninstall 包名 | 安装一个包/卸载一个包 |
npm init [-y] | 初始化一个package.json文件 |
npm install -save | 将安装的包添加到package.json的依赖中 |
npm docs 包名 | 查看包的文档 |
npm list | 查看当前目录下安装的所有包 |
npm update 包名 | 更新指定的包名. |
(3):包模块加载规则.
1:模块分为文件模块,和核心模块,包模块。
2:在加载的时候,Node.js默认会把它当作核心模块去加载,如果发现标识名不是核心模块,就会在当前目录的node_moudules目录下寻找。如果没有找到,Node.js会从当前目录的父目录的node_modules里搜索,这样递归下去直到根目录。
3:在你下载一个包后会在当前根目录下生成node_modules这个目录。然后把该报放在该目录下。
4:如果找到了该标识名的子目录,Node.js将会找到该子目录下的package.json文件,获取该文件中main属性的值,根据main属性指定的路径值进行加载。这样做的好处是在用户使用第三方模块的时候,不用关心入口模块是哪个文件。
5:示例:我刚刚下载了markdown包;
他的目录:
注意:使用命令行操作时要在当前根目录下,代码地址:D:\Program Files\nodejs\chapter\加载模块.js
var obj = require('markdown'); //加载markdown包 console.log('加载成功'); console.log(typeof obj); console.log(obj);
命令行输出:
D:\Program Files\nodejs\chapter>node 加载包模块.js
加载成功
object
{
markdown: { //可以去查看以下package.json文件.
Markdown: [Function] {
mk_block: [Function],
dialects: [Object],
buildBlockOrder: [Function],
buildInlinePatterns: [Function],
DialectHelpers: [Object],
subclassDialect: [Function]
},
parse: [Function],
toHTML: [Function: toHTML],
toHTMLTree: [Function: toHTMLTree],
renderJsonML: [Function]
},
parse: [Function: toHTML]
}