这里主要讲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. server2008 IIS7配置全过程(包括发布ASP网站)

    一.安装IIS 1.打开服务器管理器->角色->添加角色,选中WEB服务器(IIS),记得要把包括之后出现的ASP相关的东西都选中并安装,安装成功后,打开http://localhost/ ...

  2. Task4

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. 老男孩Day3作业:工资管理系统

    作业需求: 1.从info.txt文件中读取员工及其工资信息,最后将修改或增加的员工工资信息也写入原info.txt文件. 2.能增查改员工工资 3.增.改员工工资用空格分隔 4.实现退出功能 1)编 ...

  4. 获取WPF窗体/控件的句柄/当前进程的句柄

    1.在WPF中,获取当前窗体的句柄与WINFORM中不一样: WINFORM直接获取:this.Handle----------this是窗体的类名,handle就是句柄. 2.WPF中先引用命名空间 ...

  5. P1472 奶牛家谱 Cow Pedigrees

    题意:问你指定二叉树有几种 1.高度为k 2.节点数为n 3.每个点的度为0或2 爆搜------->30分QAQ 首先,因为每个节点度为0或2, 所以如果n是偶数直接输出0就行了吧(嘿嘿) 如 ...

  6. CF580D Kefa and Dishes 状压dp

    When Kefa came to the restaurant and sat at a table, the waiter immediately brought him the menu. Th ...

  7. pycharm加开头注释

    选择 File and Code Templates -> Files -> Python Script #!/usr/bin/env python # encoding: utf-8 ' ...

  8. springboot整合fastdfs

    首先pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ...

  9. 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_类型的各种成员

    [Class中,可能包含的成员] 常量, 字段, 实例构造器, 类型构造器, 方法, 操作符重载, 转换操作符, 属性, 事件, 类型(Class)

  10. nginx配置文件企业优化

    1.1 企业规范优化Nginx配置文件 第一个里程碑:创建扩展目录,生成虚拟主机配置文件 mkdir extra sed -n '10,15p' nginx.conf >extra/www.co ...