这里主要讲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. Shell脚本标准

    #!/bin/bash #Usage: # ./shell.sh dbname user passwd #----------------------------------------------- ...

  2. [USACO07JAN]平衡的阵容Balanced Lineup BZOJ 1699

    题目背景 题目描述: 每天,农夫 John 的N(1 <= N <= 50,000)头牛总是按同一序列排队. 有一天, John 决定让一些牛们玩一场飞盘比赛. 他准备找一群在对列中为置连 ...

  3. SQL 模糊查询 可以正则匹配 (转)

    1. % 表示任意0个或多个字符.如下语句:Select * FROM user Where name LIKE '%三%'; 将会把name为“张三”,“三脚猫”,“唐三藏”等等有“三”的全找出来. ...

  4. 详解linux下批量替换文件内容的三种方法(perl,sed,shell)

    在建设本网站的时候,发现新建了很多的网页,突然发现,每个文件都需要进行修改一样的内容,一个一个打开很是麻烦,所以,总结了一下如何快速修改一个目录下多个文件进行内容替换.第三种方法用的不多 方法一 使用 ...

  5. Linode安装环境

    Ubuntu 18 密码:Fenghaiyan35 netstat -plnt                           //查看所有文件 sudo apt-get install apac ...

  6. 【Leetcode】Single Number

    Given an array of integers, every element appears twice except for one. Find that single one. Note:Y ...

  7. vmware正在使用中问题

    解决方法:找到vmware目录下的.lck文件,将其删掉即可.

  8. Modbus协议学习笔记

    之前也有写过基于 Modbus 通讯协议的控制远程监控程序,但是由于当时时间赶.人手少(软硬件前后台都是在下一人

  9. Java学习笔记day04_数组

    1.switch case switch语句中表达式的数据类型是有要求的: JDK 1.0 ~ 1.4 , 数据类型接受byte, short, int, char JDK 1.5 , 数据类型接受b ...

  10. my20_mysql的本地用户无法连接到数据库

    mysql的本地用户无法连接到数据库$ mysql -uadmin -prootroot -hlocalhost -P3309mysql: [Warning] Using a password on ...