读书笔记-你不知道的JS中-promise
之前的笔记没保存没掉了,好气,重新写!
填坑……
现在与将来
在单个JS文件中,程序由许多块组成,这些块有的现在执行,有的将来执行,最常见的块单位是函数。
程序中'将来'执行的部分并不一定在'现在'运行的部分执行完之后就立即执行,即异步执行将来的部分。
//异步请求data数据
_.ajax('data');
//打印data数据
//一般情况下是打印不出来的
console.log(data);
一般的ajax请求都不是同步完成,如果要正确打印出data,最简单的方法是使用一个回调函数。
//异步请求data数据
_.ajax('url', function(data) {
//取到数据并打印了出来
console.log(data);
});
异步控制台
console对象并不是ECMA标准中的规定的,而是宿主环境(浏览器)添加到Javascript中的。
因此,不同的浏览器和Javascript环境可以按照自己的意愿来实现,有时候这个会引起混淆。
明确一点讲,有些情况下,某些浏览器的console.log(..)并不会把传入的内容立即输出。出现这种情况的主要原因是,在许多程序(not only Javascipt)中,I/O是非常低速的阻塞部分。所以,浏览器在后台异步处理控制器I/O能够提高性能,这时用户(开发也是)可能根本意识不到其发生。
比如说:
var obj = {
index: 1
};
console.log(obj);
obj.index++;

严格来讲,obj.index++应该在打印之后才执行。但是,这段代码运行的时候,浏览器可能会认为需要把控制台I/O延迟到后台,这种情况下,++可能已经执行,因此会打印出index:2。
异步特殊情况
并发
当两个异步请求都完成,才调用某个函数:
var a, b;
//只有当两个异步请求都完成时才会调用指定函数
_.ajax('url1', function() {
a = 1;
if (a && b) {
log();
}
});
_.ajax('url2', function() {
b = 1;
if (a && b) {
log();
}
});
function log() {
console.log(a + b);
}
竞态
第二种情况是只要有一个异步请求完成,就调用某个函数。
var a;
//有一个异步完成就会调用函数
//第二个会被舍弃
_.ajax('url1', function(data) {
a = data;
if (!a) {
log();
}
});
_.ajax('url2', function(data) {
a = data;
if (!a) {
log();
}
});
function log() {
console.log(a);
}
节流阀
第三种情况是当请求到大量数据并需要进行处理时,可以通过异步来分批处理。
var res = [];
//节流阀函数
function fn(data) {
//每次处理1000个数据
//书上未做这个判断 最后可能只有少量数据
var chunk = data.length > 1000 ? data.splice(0, 1000) : data.splice(0, data.length);
//处理数据 这里只是一个简单案例
res = res.concat(chunk.map(function(val) {
return val * 2;
}));
//是否仍有数据
if (data.length > 0) {
//异步处理
setTimeout(function() {
fn(data);
}, 0);
}
}
//ajax获取大量数据
_.ajax('url', data);
由于setTimeout是task事件(详细介绍可以看我的另外一个博客),所以会在主线程其他函数完事后插进去,保证页面流畅。
读书笔记-你不知道的JS中-promise的更多相关文章
- 读书笔记-你不知道的JS中-promise(3)
坑坑坑 关于术语:决议.完成以及拒绝. 首先观察Promise(..)构造器: var p = new Promise(function(x, y) { //x() 用于完成 //y() 用于拒绝 } ...
- 读书笔记-你不知道的JS中-promise(2)
继续填坑 模式 考虑下面的代码: function fn(x) { //do something return new Promise(function(resolve, reject) { //调用 ...
- 读书笔记-你不知道的JS中-函数生成器
这个坑比较深 可能写完我也看不懂(逃 ES6提供了一个新的函数特性,名字叫Generator,一开始看到,第一反应是函数指针?然而并不是,只是一个新的语法. 入门 简单来说,用法如下: functio ...
- 读书笔记-你不知道的JS上-对象
好想要对象··· 函数的调用位置不同会造成this绑定对象不同.但是对象到底是什么,为什么要绑定他们呢?(可以可以,我也不太懂) 语法 对象声明有两个形式: 1.字面量 => var obj = ...
- 读书笔记-你不知道的JS上-this
关于this 与静态词法作用域不用,this的指向动态绑定,在函数执行期间才能确定.感觉有点像C++的多态? var a = 1; var obj = { a: 2, fn: function() { ...
- 读书笔记-你不知道的JS上-函数作用域与块作用域
函数作用域 Javascript具有基于函数的作用域,每声明一个函数,都会产生一个对应的作用域. //全局作用域包含f1 function f1(a) { var b = 1; //f1作用域包含a, ...
- 读书笔记-你不知道的JS上-词法作用域
JS引擎 编译与执行 Javascript引擎会在词法分析和代码生成阶段对运行性能进行优化,包含对冗余元素进行优化(例如对语句在不影响结果的情况下进行重新组合). 对于Javascript来说,大部分 ...
- 读书笔记-你不知道的JS上-混入与原型
继承 mixin混合继承 function mixin(obj1, obj2) { for (var key in obj2) { //重复不复制 if (!(key in obj1)) { obj1 ...
- 读书笔记-你不知道的JS上-闭包与模块
闭包定义 当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行. 看一段最简单的闭包代码: function foo() { var a = 2; //闭包 fun ...
随机推荐
- Java学习笔记四---打包成双击可运行的jar文件
写笔记四前的脑回路是这样的: 前面的学习笔记二,提到3个环境变量,其中java_home好理解,就是jdk安装路径:classpath指向类文件的搜索路径:path指向可执行程序的搜索路径.这里的类文 ...
- jQuery基礎知識
jQuery基礎知識 $(function(){}) //jQuery先執行一遍再執行其他函數 $(document).ready(fn) //文檔加載完後觸發 1. 刪除$:jQuery.noCon ...
- [UIKit学习]01.关于UIView,frame,bounds,center
UIView是Cocoa大多控件的父类,本身不带事件. UIView的常见用法 @property(nonatomic,readonly) UIView *superview; 获得自己的父控件对象 ...
- A glimpse of Support Vector Machine
支持向量机(support vector machine, 以下简称svm)是机器学习里的重要方法,特别适用于中小型样本.非线性.高维的分类和回归问题.本篇希望在正篇提供一个svm的简明阐述,附录则提 ...
- Angular2响应式表单
本文将半翻译半总结的讲讲ng2官网的另一个未翻译高级教程页面. 原文地址. 文章目的是使用ng2提供的响应式表单技术快速搭出功能完善丰富的界面表单组件. 响应式表单是一项响应式风格的ng2技术,本文将 ...
- MX4拍摄视频转码方法
问题 使用魅族4手机拍摄的视频,其视频编码是H.265 目前大多数设备不支持解码,表现为常用播放器无法正常播放视频,剪辑软件无法剪辑视频. 解决方案 使用软件进行转码,期间尝试软件如下: 爱剪辑 部分 ...
- python文件名和文件路径操作
Readme: 在日常工作中,我们常常涉及到有关文件名和文件路径的操作,在python里的os标准模块为我们提供了文件操作的各类函数,本文将分别介绍"获得当前路径""获得 ...
- C "right-left" 从左到右
葵花宝典:http://ieng9.ucsd.edu/~cs30x/rt_lt.rule.html C混带代码大赛
- Codeforces 858A. k-rounding 数论
题目: 题意:输入n和k,找到一个最小的数,满足末尾有至少k个0和是n的倍数. 最小的情况 ans = n,最大的情况 ans = n*pow(10,k). 令 k = pow(10,k); 我们发现 ...
- 线段树专题—ZOJ1610 Count the Colors(涂区间,直接tag标记)
Painting some colored segments on a line, some previously painted segments may be covered by some th ...