《你不知道的javascript - 中册》笔记 二

事件循环

每一轮微一个Tick  任务队列 在每一个tick之后 

回调

- 不够直观难以追踪

- 受控制反转影响 控制权交给第三方 来调用continuation 会导致一系列得麻烦

Promise

决议P控制 一旦决议 不可逆转 

判断是都是promise 具有then()方法的对象和函数 鸭子类型

Promise信任问题

- 调用过早

- 调用过晚 根据Promise决议来控制接下来的调用 所以 早晚都没有影响

- 回调未调用 成功或者失败都会有一个回调 如果未决议设置定时器 保证其不会永久挂住 至少有一个输出信号

- 调用次数过多或者过少 Promise只决议一次 如果注册了多次 那就和注册次数相同

- 未能传参 如果没有任何显式决议 那这个值就是undefined 

- 吞掉错误 或 异常 导致return的Promise被拒绝 所以下面的Promise无法继续执行 

链式流

return 创建一个Promise 如果返沪i一个Promise 将展开作为下一个.then()的决议 如果不是 则会对其相应resolve()

错误处理

异步执行的函数里面的错误没有捕捉

解决: - 定义定时器 Err时触发 限时内未处理 则警告 缺点 限制时长随意 而且有的时候允许异常存在  

- 利用浏览器垃圾回收机制 判断 - defer()

Promise 模式

Promise.all[] 门 控制数组中所有决议完成 才会运作后面的 传空值会立即完成

Promise.race[] 决议结果为数组中响应最快的 传空永不决议

建议finally 执行Promise超时了也要执行的事情 还要返回一个Promise 继续执行链接

变体 none[] 全部拒绝  any[] 忽略拒绝 只要有一个完成就可以 first[]第一个 last[] 最后一个

并发迭代 对所有Promise执行某个任务

Promise API

new Promise() 构造器 必须和new一起使用 必须有回调函数

Promise.resolve() Promise.reject() then() catch() Promise.all[] Promise.race[]

Promise局限性

- 顺序错误处理 - 单一值 - 单决议 - 惯性 - 无法取消的Promise 

生成器

yield 暂停 打破函数完整性运行

迭代器 有next()方法 iterable可以在其之上进行迭代的对象

iterable必须支持一个函数 [Symbol.iterable]:function(){ return this};

用it.next() 迭代器控制 第一次的next()启动生成器 无参

异步迭代生成器

把异步的代码堪称看似同步 通过生成器 yield的配合 可以在每一个异步结果查看其值 并捕捉Error

Promise + 生成器

yield 处一个Promise 然后通过Promise控制生成器的迭代器 继续进行下一个判断 辅助函数 Generator Runner

生成器中的Promise并发 可以利用Promise.all[]等 实现并发操作

生成器委托

消息委托 双向消息传递 

异步委托 yield *function()

递归委托 可以使用yield委托实现异步的生成器递归 即一个yield委托到它自身的生成器

生成器并发 协调控制转移 彼此通信  “通信顺序进程CSP”

程序性能

webworker 任务并行

Worker 之间以及它们和主程序之间,不会共享任何作用域或资源 

var w1 = new Worker( "http://some.url.1/mycoolworker.js" );

互相传送消息  一对一的关系 worker可以有子worker 叫subworker

addEventListener( "message", function(evt){
// evt.data
} );

postMessage( "a really cool reply" );

中止worker  w1.terminate();

worker环境

- worker内部无法访问主程序的任何资源 完全独立的线程

- 可以执行网络操作(Ajax、 WebSockets)以及设定定时器

- 可以访问几个重要的全局变量和功能的本地复本,包括 navigator、 location、 JSON 和 applicationCache

- 通过 importScripts(..) 向 Worker 同步加载额外的 JavaScript 脚本

数据传递

- 早期通过把数据序列化到一个字符串中进行传递 出了序列化导致的速度损失 还有被复制造成的双倍内存损失

- 现在 如果传递一个对象 可以使用“结构化克隆算法”  甚至可以处理对象有循环引用的情况 还是要双倍内存

- 对于大数据集 可以使用Transferable对象 对象所有权转移 数据没有移动 

共享worker

SharedWorker 所有页面共享的中心worker 唯一标识符 端口 port 

端口初始化 w1.port.start(); 

带端口传递信息 

w1.port.addEventListener( "message", handleMessages );
w1.port.postMessage( "something cool" );
connect 为特定连接提供端口对象 函数内部

SIMD 单指令多数据 数据并行 

利用低级指令级并行的底层运算 

asm.js 

JavaScript语言中可以高度优化的一个子集

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值