金字塔式

//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异步编程。的更多相关文章

  1. 09-Node.js学习笔记-异步编程

    同步API,异步API 同步API:只有当前API执行完成后,才能继续执行下一个API console.log('before'); console.log('after'); 异步API:当前API ...

  2. JavaScript异步编程

    前言 如果你有志于成为一个优秀的前端工程师,或是想要深入学习JavaScript,异步编程是必不可少的一个知识点,这也是区分初级,中级或高级前端的依据之一.如果你对异步编程没有太清晰的概念,那么我建议 ...

  3. Func-Chain.js 另一种思路的javascript异步编程解决方案

    本文转载自:https://www.ctolib.com/panruiplay-func-chain.html Func-Chain.js 另一种思路的javascript异步编程,用于解决老式的回调 ...

  4. JavaScript异步编程的主要解决方案—对不起,我和你不在同一个频率上

    众所周知(这也忒夸张了吧?),Javascript通过事件驱动机制,在单线程模型下,以异步的形式来实现非阻塞的IO操作.这种模式使得JavaScript在处理事务时非常高效,但这带来了很多问题,比如异 ...

  5. JavaScript 异步编程的前世今生(上)

    前言 提到 JavaScript 异步编程,很多小伙伴都很迷茫,本人花费大约一周的业余时间来对 JS 异步做一个完整的总结,和各位同学共勉共进步! 目录 part1 基础部分 什么是异步 part2 ...

  6. JavaScript异步编程原理

    众所周知,JavaScript 的执行环境是单线程的,所谓的单线程就是一次只能完成一个任务,其任务的调度方式就是排队,这就和火车站洗手间门口的等待一样,前面的那个人没有搞定,你就只能站在后面排队等着. ...

  7. 深入解析Javascript异步编程

    这里深入探讨下Javascript的异步编程技术.(P.S. 本文较长,请准备好瓜子可乐 :D) 一. Javascript异步编程简介 至少在语言级别上,Javascript是单线程的,因此异步编程 ...

  8. Javascript异步编程之一异步原理

    本系列的例子主要针对node.js环境,但浏览器端的原理应该也是类似的. 本人也是Javascript新手,把自己这段时间学习积累的要点总结下来,希望可以对同样在学习Javascript/node.j ...

  9. 探索Javascript异步编程

    异步编程带来的问题在客户端Javascript中并不明显,但随着服务器端Javascript越来越广的被使用,大量的异步IO操作使得该问题变得明显.许多不同的方法都可以解决这个问题,本文讨论了一些方法 ...

随机推荐

  1. mac上的键盘生活——输入法键位设置小技巧以及去掉自带输入法

    今天上QQ跟阳小进讨论的时候突然聊到了输入法,然后阳小进就发了这样一段文字过来: 修改中西文切换键由Shift到Ctrl 关于为什么要改为Ctrl键,贴吧里有个讨论 在贴吧说服佛振的网友: 「因为 S ...

  2. select、poll、epoll三组IO复用

    int select(int nfds,fd_set* readfds,fd_set* writefds,fd_set* exceptfds,struct timeval* timeout)//其中n ...

  3. C语言学习_include<>与include""的区别

    经常会遇到两种include引用头文件的情况,其实区别很简单,如下: 一.#include< > #include< > 引用的是编译器的类库路径里面的头文件. 假如你编译器定 ...

  4. 查看线程linux cpu使用率

    Linux下如何查看高CPU占用率线程 LINUX CPU利用率计算 转 http://www.cnblogs.com/lidabo/p/4738113.html目录(?)[-] proc文件系统 p ...

  5. linux系统启动oracle

    linux下启动oracle需要两步:一.启动监听  二.启动服务 一.启动监听 监听命令:lsnrctl ,具体使用方法如下 1.lsnrctl status:检查当前监听器的状态 2.lsnrct ...

  6. eclipse GWT开发环境的离线布置方法

    安装方法http://blog.csdn.net/u011029071/article/details/10143841 用eclipse自动更新安装失败N次,还是得手动来 以Google Plugi ...

  7. 移植opencv库到zedboard(制作运行库镜像) 分类: OpenCV ZedBoard ubuntu shell Eye_Detection 2014-11-08 18:48 172人阅读 评论(0) 收藏

    主要参考rainysky的博客 http://ledage.eefocus.com/sj229335457/blog/13-06/295352_ad954.html opencv的话只需要将lib这个 ...

  8. [RxJS] Filtering operators: takeLast, last

    Operators take(), skip(), and first() all refer to values emitted in the beginning of an Observable ...

  9. python模拟登陆之下载

    好长时间没有更新博客了,哈哈. 今天公司给了这么一个需求,现在我们需要去淘宝获取上一天的订单号,然后再根据订单号去另一个接口去获取订单详情,然后再给我展示到web! 中间涉及到的技术点有: 模拟登陆 ...

  10. 虚拟机如何访问tomcat

    首先需要把tomcat和jdk整到虚拟机里,然后再在虚拟机里安装tomcat和jdk. 一.怎样把tomcat和jdk整到虚拟机里? 1,需要“ha_Serv-U6406 ftp服务器”的帮助,所以先 ...