这里主要讲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. Linux 编写安全巡检脚本

    Linux 编写安全巡检脚本 检测/etc/passwd,/etc/shadow文件是否锁定 检测/etc/login.defs配置文件中密码有效期设置是否得当 检查所有用户账户(非系统账户)中是否存 ...

  2. (原创)Codeforces Round #550 (Div. 3) D. Equalize Them All

    D. Equalize Them All time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  3. iOS10 新特性-新功能,以及ReplayKit库

    iOS的10.0 本文总结了iOS的10,运行于目前推出iOS设备推出的主要开发者相关的功能. iOS版10引入了新的方法来增加您的应用程序通过帮助系统参与在适当的时候建议你的应用程序给用户.如果你在 ...

  4. P2900 [USACO08MAR]土地征用Land Acquisition

    \(\color{#0066ff}{ 题目描述 }\) 约翰准备扩大他的农场,眼前他正在考虑购买N块长方形的土地.如果约翰单买一块土 地,价格就是土地的面积.但他可以选择并购一组土地,并购的价格为这些 ...

  5. 【三支火把】--- shell脚本中变量的类型及作用域

    一直对shell脚本有一种特殊的感觉,因此花了一段时间学习,本人擅长C语言编程,深受C语言荼毒,在学习其他任何类似于编程语言的东东的时候,都会不自觉的与C进行对比,因此对于shell中的变量的作用域一 ...

  6. 前三次OO作业总结

    一.作业总结 前三次的任务都是表达式求导.这是我在高中就思考过的问题,但是很久都没有付诸实践,直到学习了"类"这个强大的工具.还有正则表达式,如果能适当使用,则不失为一个字符串格式 ...

  7. 实验吧之Canon

    解压zip文件得到一个mp3文件和一个zip压缩包,解压需要密码,那密码就在mp3里面,使用MO3Stego好像不能解析出文本,说明解析需要密码,此时通过网上的讨论说标题Canon就是密码,就试着用了 ...

  8. 使用git将本地代码提交到码云上去

    码云为开源中国基于git的代码网络托管平台,将代码托管.开发与项目管理工具融为一体.今天第一次将自己的web项目代码上传至码云,过程中遇到一些问题,此处进行总结与过程的演示:当我们在码云上创建好项目后 ...

  9. crm web ui

    1:View中的field对应于model中的attribute. 2:custom controller具有更长的生存时间,能够在view中共享一些数据. 3:window是component的一个 ...

  10. js 点击图片放大,再点击缩小还原

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