金字塔式

//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. [转]让程序在崩溃时体面的退出之SEH+Dump文件

    原文地址:http://blog.csdn.net/starlee/article/details/6649605 在我上篇文章<让程序在崩溃时体面的退出之SEH>中讲解了SEH中try/ ...

  2. SDN基础理解

    本文转载自:http://blog.csdn.net/freezgw1985/article/details/16873677 个人觉得对很适合对SDN的入门级的概念性理解,先暂时copy一下,等研究 ...

  3. flexpaper 与js 交互

    flash 代码//写到要响应的方法体中import flash.external.ExternalInterface;ExternalInterface.call("alert" ...

  4. 【Lucene3.6.2入门系列】第14节_SolrJ操作索引和搜索文档以及整合中文分词

    package com.jadyer.solrj; import java.util.ArrayList; import java.util.List; import org.apache.solr. ...

  5. NIO与普通IO文件读写性能对比

    最近在熟悉java的nio功能.nio采用了缓冲区的方式进行文件的读写,这一点更接近于OS执行I/O的方式.写了个新旧I/O复制文件的代码,练练手,顺便验证一下两者读写性能的对比,nio是否真的比普通 ...

  6. sdut-2725-The Urge to Merge-状压DP

    把数组竖起来,从上往下走. 如果当前位置是竖着乘的,那么第一个点标记为1.否则标记为0. 样例最终的状态为: 0 0 1 0 1 0 1 0 0 0 0 0 #include<iostream& ...

  7. SQL 计算两个时间之差 分类: SQL Server 2014-07-04 10:57 119人阅读 评论(0) 收藏

    SQL语句: A,B为两个字段,A为开始时间,B为结束时间,ss为秒. SELECT datediff(ss,A,B)  FROM Table 详细:http://www.w3school.com.c ...

  8. 多次读取请求request里数据

    如果请求是GET方法,可以直接通过getParameter(String param)方法读取指定参数,可读取多次: 而POST方法的参数是存储在输入流中,只能读一次,不能多次读取. 有时需要在fil ...

  9. HDU5047Sawtooth(java大数)

    HDU5047Sawtooth(java大数) 题目链接 题目大意:在一个矩形内画n个"M".问如何画可以把这个矩形分成最多的区域. 给出这个区域的数目. 解题思路:最好的方式就是 ...

  10. delphi 保存 和 打开 TREE VIEW的节点已经展开的状态

    保存 和 打开 TREE VIEW的节点已经展开的状态 如果每次打开后能自动读取上次展开的状态就会非常快捷 下载地址: 实现方法 将已经展开的节点索引 放在一个文本中最后选中的那个节点索引放在最后一位 ...