这里主要讲node.js中Q的各种用法及说明总结,不详细介绍promise及原理。关于promise介绍可以查看我的另一篇文章:

https://www.cnblogs.com/yzeng/p/9761605.html

* promise是解决JS中回调层次太深 代码难懂 改起来麻烦的问题。

Q是nodeJs中实现promise的包之一,是nodeJs中比较常用的一个库。

在你的项目中安装Q的方法:

npm install q -save

装好后我们就可以用Q来实现nodejs的promise了!

Q实现promise的常用方法有7个,在不同情况下使用不同的方法,下面就一一来介绍:

------------低-----调-----的-----分-----割-----线-------------------------------

Q
将数据封装成promise
特点:封装一个数据,调用then直接得到该数据
示例:
Q('hello,world').then(...);
 
------------低-----调-----的-----分-----割-----线-------------------------------
 
Q.fcall
将同步方法封装成promise
特点:传递一个function,返回一个promise,调用then得到方法的返回值
示例:Q.fcall(function(){return 123;}).then(...);
 
------------低-----调-----的-----分-----割-----线-------------------------------
 
 
Q.nfcall:
将异步方法封装成promise
特点:封闭时就得传递调用方法的参数,直接得到promise
示例:Q.nfcall(fun,p1,p2).then(...);
PS:此方法要求异步方法遵循nodejs的回调标准,否则可能出现错乱。
 
------------低-----调-----的-----分-----割-----线-------------------------------
 
Q.denodeify:
将异步方法封装成promise
特点:封装后返回一个方法,调用此方法得到promise
示例:
var dd = Q.denodeify(fun);
dd(p1,p2).then(...);
PS:此方法要求异步方法遵循nodejs的回调标准,否则可能出现错乱。
 
------------低-----调-----的-----分-----割-----线-------------------------------
 
Q.defer:
手动封装一个promise
特点:使用deferd对象的reject方法(失败回调)、resolve方法(成功回调)、promise属性来实现自定义promise。(前面2个nfcal、denodeify底层应该也是用deferd实现的)
示例:
假设readfile为一个异步方法
var readfile_d=function(filename){
     var defer=Q.defer();
     readfile(filename,function(err,rs){
          if(err) defer.reject(err);
          else defer.resolve(rs);
     });
     return defer.promise;
}
readfile_d(filename).then(...);
PS:此方法比较灵活,可以根据业务选择相应的回调,使用的方法无需遵循nodejs的回调标准。
 
------------低-----调-----的-----分-----割-----线-------------------------------
 
Q.makeNodeResolver:
手动封装一个promise
特点:和第deferd原理差不多,只不过用了deferd自带的方法省掉了我们手动实现reject方法、resolve方法
示例:
假设readfile为一个异步方法
var readfile_d=function(filename){
     var defer=Q.defer();
     readfile(filename,defer. makeNodeResolver());
     return defer.promise;
}
readfile_d(filename).then(...);
PS:此方法要求异步方法遵循nodejs的回调标准,否则可能出现错乱。
 
------------低-----调-----的-----分-----割-----线------------------------------
 
Q.all
将一批promise封装成一个promise
特点:可以并行执行一批promise,全部执行完毕后一起返回,得到的结果是一个数组
示例:
Q.all([promise1,promise2,promise3]).then(...);
 
------------低-----调-----的-----分-----割-----线-------------------------------
 
以上这些就是nodeJs中Q的常用方法,几乎满足日常任何场景中的使用。
 

promise之nodejsQ的详细用法总结的更多相关文章

  1. C#播放声音的四种方法 +AxWindowsMediaPlayer的详细用法

    C#播放声音的四种方法 第一种是利用DirectX 1.安装了DirectX SDK(有9个DLL文件).这里我们只用到MicroSoft.DirectX.dll和 Microsoft.Directx ...

  2. 在DOS下的DEBUG命令的详细用法

    在DOS下的DEBUG命令的详细用法 名称 解释 格式 a (Assemble) 逐行汇编 a [address] c (Compare) 比较两内存块 c range address d (Dump ...

  3. __declspec关键字详细用法

    __declspec关键字详细用法 __declspec用于指定所给定类型的实例的与Microsoft相关的存储方式.其它的有关存储方式的修饰符如static与extern等是C和C++语言的ANSI ...

  4. CString.Format的详细用法(转)

    CString.Format的详细用法(转) 在MFC程序中,使用CString来处理字符串是一个很不错的选择.CString既可以处理Unicode标准的字符串,也可以处理ANSI标准的字符串.CS ...

  5. IFRAM的详细用法

    IFRAM的详细用法:   IFRAM的详细用法:  <IFRAME>用于设置文本或图形的浮动图文框或容器. BORDER <IFRAME BORDER="3"& ...

  6. 【转】java.util.vector中的vector的详细用法

    [转]java.util.vector中的vector的详细用法 ArrayList会比Vector快,他是非同步的,如果设计涉及到多线程,还是用Vector比较好一些 import java.uti ...

  7. DOM Style样式对象的详细用法

    DOM Style样式对象的详细用法 HTML Style样式比较复杂,相应访问.修改方法也有所差异.参考相关资料,整理如下. 典型Html文件如下,有三种定义方式. <head>     ...

  8. css基础之 font的简写规则 以及 自定义 CSS3 @font-face详细用法

    Part 1 font简写 CSS的命名规则是用英文字母 数字 和下划线(一般用小写)来命名.简写css font的好处有三:一是写起来方便(就像键盘快捷键):二是简化代码:三是帮助你熟悉和深刻理解c ...

  9. Tomcat详细用法学习(三)

    本篇接上一篇<Tomcat详细用法学习(二)>,主要讲解服务器所要求的web应用的组织结构. 上一篇说到了如何使用服务器将自己的web应用映射成虚拟目录,以便于在浏览器中可以对自己开发的w ...

随机推荐

  1. 利用filter,巧妙地去除Array的重复元素

    var r, arr = ['apple', 'strawberry', 'banana', 'pear', 'apple', 'orange', 'orange', 'strawberry']; r ...

  2. 循环队列(Joseplus Problem)

    #include <iostream> #include <stdio.h> using namespace std; ]; ; void Enqueue(int x) { ) ...

  3. 51nod1453(排列组合)

    题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1453 题意: 中文题诶~ 思路: 因为最后一个球总是在编号比 ...

  4. java中抽象类与接口

    1.抽象类是类,它的子类不能再继承其它类了,但可以实现一个和多个接口.接口不是类,它的子接口可以继承多个接口.2.抽象类中是可以有不用abstract修饰的方法,而接口中只能有抽象方法,即方法都要用a ...

  5. mybatis 日期查询datetime

    <select id="getHistoryDataByDate" parameterType="java.util.HashMap" resultTyp ...

  6. sql遍历查询结果sql循环查询结果集sql循环查询

    --查询表B,把查询到的数据插入临时表#A中,根据表B 的ID 进行排序:表#A中 的 i  字段 由1开始增加排序:        SELECT ROW_NUMBER() OVER ( ORDER ...

  7. luogu3312 [SDOI2014]数表 (莫比乌斯反演+树状数组)

    link \(\sum_{i=1}^n\sum_{j=1}^m[s(\gcd(i,j))\le a]s(\gcd(i,j))\) \(=\sum_{p=1}^ns(p)[s(p)\le a]\sum_ ...

  8. ArcGIS api for javascript-图层控制(图层树)

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  9. HackerRank - array-partition 并查集

    https://vjudge.net/contest/279745#problem/G 每次将质数的倍数放进一个集合中,那么如果最后的集合数为n的话: 方案数: 2^n -2 : #include&l ...

  10. 安装 zookeeper

    https://www.w3cschool.cn/zookeeper/zookeeper_cli.html ZooKeeper是一种分布式协调服务,用于管理大型主机.在分布式环境中协调和管理服务是一个 ...