读书笔记-你不知道的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 ...
随机推荐
- const在c和c++中的不同
最近开始由学习c转到c++:从面向过程到面向对象的转变中,总是以面向过程的思路思考,发现有很多的不同,今天就稍微发表一下我的见解,如果那里出错,希望大神可以帮忙指出来. 首先是const : 在C语法 ...
- 【SQL】- 基础知识梳理(六) - 游标
游标的概念 结果集,结果集就是select查询之后返回的所有行数据的集合. 游标(Cursor): 是处理数据的一种方法. 它可以定位到结果集中的某一行,对数据进行读写. 也可以移动游标定位到你需要的 ...
- java 对象转型
一.对象转型介绍 对象转型分为两种:一种叫向上转型(父类对象的引用或者叫基类对象的引用指向子类对象,这就是向上转型),另一种叫向下转型.转型的意思是:如把float类型转成int类型,把double类 ...
- 【黑马18期Java毕业生】黑马程序员Java全套资料+视频+工具
Java学习路线图引言: 黑马程序员:深知广大爱好Java的人学习是多么困难,没视频没资源,上网花钱还老被骗. 为此我们历时一个月整理这套Java学习路线图,不管你是不懂电脑的小 ...
- java初学者(新手)应该如何选择学习教材与网站
作者:天天向上 1.学习教材选择推荐<JAVA核心技术>,想多看点代码多练习可以找<java开发实战经典>&amp;lt;img src="https ...
- 关于CSDN, cnblog, iteye和51cto四个博客网站的比较与分析
http://blog.csdn.net/pkucl1/article/details/6629819 CSDN: http://blog.csdn.net/ cnblog: http://www ...
- 张高兴的 Windows 10 IoT 开发笔记:使用 Lightning 中的软件 PWM 驱动 RGB LED
感觉又帮 Windows 10 IoT 开荒了,所以呢,正儿八经的写篇博客吧.其实大概半年前就想写的,那时候想做个基于 Windows 10 IoT 的小车,但树莓派原生不支持 PWM 啊.百度也搜不 ...
- JavaWeb(三)JSP之3个指令、6个动作、9个内置对象和4大作用域
前言 前面大概介绍了什么是JSP,今天我给大家介绍一下JSP的三个指令.6个动作以及它的9大内置对象.接下来我们就直接进入正题 一.JSP的3个指令 JSP指令(directive)是为JSP引擎而设 ...
- 扩展javascript扩展(类,对象,原型)
扩展javascript扩展(类,对象,原型)
- c# 【MVC】WebApi通过HttpClient来调用Web Api接口
/// <summary> /// HttpClient实现Post请求(异步) /// </summary> static async void dooPost() { st ...