借助Q.js学习javascript异步编程。
金字塔式
//add1
function step1(n, callback) {
setTimeout(function(){
callback.call(null, n + 1);
}, 100);
};
//add2
function step2(n, callback) {
setTimeout(function(){
callback.call(null, n + 2);
}, 100);
};
//add3
function step3(n, callback) {
setTimeout(function(){
callback.call(null, n + 3);
}, 100);
};
//add4
function step4(n, callback) {
setTimeout(function(){
callback.call(null, n + 4);
}, 100);
};
首先看这4个方法,都是setTimeout加上一个数字。接下来我们就用这四个方法实现+1,+2,+3,+4
step1(1, function(n){
step2(n, function(n){
step3(n, function(n){
step4(n, function(n){
alert(n); //11
});
});
});
});
ok~~~, 不错,功能实现了。
链式
如果我们Q.js如何来改进这段代码呢?
//add1
function step1(n) {
var dtd = Q.defer();
setTimeout(function(){
dtd.resolve(n + 1);
}, 100);
return dtd.promise;
};
//add2
function step2(n) {
var dtd = Q.defer();
setTimeout(function(){
dtd.resolve(n + 2);
}, 100);
return dtd.promise;
};
//add3
function step3(n) {
var dtd = Q.defer();
setTimeout(function(){
dtd.resolve(n + 3);
}, 100);
return dtd.promise;
};
//add4
function step4(n) {
var dtd = Q.defer();
setTimeout(function(){
dtd.resolve(n + 4);
}, 100);
return dtd.promise;
};
Q.when(step1(1))
.then(step2)
.then(step3)
.then(step4)
.then(function(n){
alert(n); //11
});
看上去好多了,金字塔不见了,就成流水一般的代码,当然单个的function有点变得复杂,但整理结构变得好理解了。
还可以这样子
Q(1)
.then(step1)
.then(step2)
.then(step3)
.then(step4)
.then(function(n){
alert(n);//11
});
我们需要一起返回 all
var func1 = function(){
var dtd = Q.defer();
setTimeout(function(){
dtd.resolve(1);
}, 1000);
return dtd.promise;
};
var func2 = function(){
var dtd = Q.defer();
setTimeout(function(){
dtd.resolve(10);
}, 2000);
return dtd.promise;
};
Q
.all([func1(), func2()])
.then(function(arr){
console.log(arr);
});
你不知道func1 和func2 什么时候会执行完成,但是我们需要这两个方法的返回结果,这看上去解决了我们的一个大问题。
spread也能实现
var func1 = function(){
return Q.Promise(function(resolve, reject, notify) {
setTimeout(function(){
resolve(1);
}, 1000);
});
}
var func2 = function(){
return Q.Promise(function(resolve, reject, notify) {
setTimeout(function(){
resolve(10);
}, 1000);
});
};
Q
.spread([func1(), func2()], function(a, b){
console.log(a, b); //1 10
});
这例子中还用了Q.Promise。 这看上去比 Q.defer()省事一点。
其实呢这库应该还有很多方法,我初学了一下,觉得不错,所以现学现卖,感兴趣的同学可以看一下这个库https://github.com/kriskowal/q
中文文档也不多,哈哈!慢慢啃吧.
学习的时候请加库
<script src="http://cdn.bootcss.com/q.js/1.4.0/q.js"></script>
借助Q.js学习javascript异步编程。的更多相关文章
- 09-Node.js学习笔记-异步编程
同步API,异步API 同步API:只有当前API执行完成后,才能继续执行下一个API console.log('before'); console.log('after'); 异步API:当前API ...
- JavaScript异步编程
前言 如果你有志于成为一个优秀的前端工程师,或是想要深入学习JavaScript,异步编程是必不可少的一个知识点,这也是区分初级,中级或高级前端的依据之一.如果你对异步编程没有太清晰的概念,那么我建议 ...
- Func-Chain.js 另一种思路的javascript异步编程解决方案
本文转载自:https://www.ctolib.com/panruiplay-func-chain.html Func-Chain.js 另一种思路的javascript异步编程,用于解决老式的回调 ...
- JavaScript异步编程的主要解决方案—对不起,我和你不在同一个频率上
众所周知(这也忒夸张了吧?),Javascript通过事件驱动机制,在单线程模型下,以异步的形式来实现非阻塞的IO操作.这种模式使得JavaScript在处理事务时非常高效,但这带来了很多问题,比如异 ...
- JavaScript 异步编程的前世今生(上)
前言 提到 JavaScript 异步编程,很多小伙伴都很迷茫,本人花费大约一周的业余时间来对 JS 异步做一个完整的总结,和各位同学共勉共进步! 目录 part1 基础部分 什么是异步 part2 ...
- JavaScript异步编程原理
众所周知,JavaScript 的执行环境是单线程的,所谓的单线程就是一次只能完成一个任务,其任务的调度方式就是排队,这就和火车站洗手间门口的等待一样,前面的那个人没有搞定,你就只能站在后面排队等着. ...
- 深入解析Javascript异步编程
这里深入探讨下Javascript的异步编程技术.(P.S. 本文较长,请准备好瓜子可乐 :D) 一. Javascript异步编程简介 至少在语言级别上,Javascript是单线程的,因此异步编程 ...
- Javascript异步编程之一异步原理
本系列的例子主要针对node.js环境,但浏览器端的原理应该也是类似的. 本人也是Javascript新手,把自己这段时间学习积累的要点总结下来,希望可以对同样在学习Javascript/node.j ...
- 探索Javascript异步编程
异步编程带来的问题在客户端Javascript中并不明显,但随着服务器端Javascript越来越广的被使用,大量的异步IO操作使得该问题变得明显.许多不同的方法都可以解决这个问题,本文讨论了一些方法 ...
随机推荐
- vijosP1059 积木城堡
vijosP1059 积木城堡 链接:https://vijos.org/p/1059 [思路] 01背包. 刚开始想麻烦了,想的是二分答案然后01背包判断是否可行,但是首先答案不满足单调性所以不能二 ...
- GDI+ —— Tcanvas 类属性及方法.......
delphi TCanvas类 类关系 TObject-> TPersistent 对那些作图对象,可使用TCanvas对象作为画布.标准的window控件,例如编辑控件和列表框控件,当 ...
- codeforces A. Jeff and Rounding (数学公式+贪心)
题目链接:http://codeforces.com/contest/351/problem/A 算法思路:2n个整数,一半向上取整,一半向下.我们设2n个整数的小数部分和为sum. ans = |A ...
- textarea文本域
textarea中换行问题 一旦用nl2br函数处理会多个\n导致十分难看 也无法形成文本框默认效果 前台的html如果用<br/>处理也会给后台的编辑造成困难 所以在编辑的时候这样处理 ...
- OBJ解析
OBJ文件是Alias|Wavefront公司为它的一套基于工作站的3D建模和动画软件"Advanced Visualizer"开发的一种标准3D模型文件格式,很适合用于3D软件模 ...
- ELK初学搭建(elasticsearch)
ELK初学搭建(elasticsearch) elasticsearch logstash kibana ELK初学搭建 elasticsearch 1.环境准备 centos6.8_64 mini ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(20)-权限管理系统-根据权限获取菜单
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(20)-权限管理系统-根据权限获取菜单 不知不觉到20讲,真是漫长的日子,可惜最近工作挺忙,要不可以有更多 ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(17)-LinQ动态排序
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(17)-LinQ动态排序 首先修复程序中的一个BUG这个BUG在GridPager类中,把sord修改为s ...
- 回收InnoDB表空间
以下论述均假定innodb_file_per_table开启 先用常规optimize回收: mysql> select count(*) from t; +----------+ | coun ...
- Androidannotation使用之@Rest与server交互的JSON数据转换(二)
开篇 之前的一篇博客:Androidannotation使用之@Rest获取资源及用户登录验证(一):http://blog.csdn.net/nupt123456789/article/detail ...