项目需要,看了点nodejs,其中比较难理解的就是Promise了,记录一下学习bluebird提供的Promise实现.

Promise.promisifyAll(obj)方法

作用:把对象的方法属性变成异步方法,会在函数加上后缀Async.

看下面的代码:

var Promise = require('bluebird')

var obj = {
func1: function () {
return 'hehe'
},
func2: function () {
return 'xix'
}
} for (var property in obj) {
console.log("%s => %s", property, obj[property])
}

for in会遍历obj的所有属性,包括原型连上的属性,此时会输出如下:

func1 => function () {
return 'hehe'
}
func2 => function () {
return 'xix'
}

那么,如果把obj promise化的话,会有什么 呢?代码改成这样:

Promise.promisifyAll(obj)
for (var property in obj) {
console.log("%s => %s", property, obj[property]) }

再看看输出结果:

func1 => function () {
return 'hehe'
}
func2 => function () {
return 'xix'
}
func1Async => function (_arg0,_arg1,_arg2) { var promise = new Promise(INTERNAL);
// 省略
return promise;
}
func2Async => function (_arg0,_arg1,_arg2) {
// 省略
return promise;
}

可以看到,obj对象多了以Async结尾的函数,并且都会返回一个promise. 既然返回了promise,那就可以把返回的值传给then里的方法了:

obj.func1Async().then(function (data) {
console.log(data)
})

可是这样并没有什么输出,经过一翻查询,promisify化需要函数满足两个条件:

  • 1. 接收0到N个参数,但最后一个参数必须是回调函数
  • 2.回调函数必须以(error, data) 调用

重新改写一下obj,如下:

var obj = {
func1: function (cb) {
cb(null, 'foo') // null为空表示没错误
},
func2: function (cb) {
cb(null, 'bar')
}
}
obj.func1Async().then(function (data) {
console.log(data)
})

这样就有输出了,输出foo

这样理解也比较难,源码现在又不太想看,以后有时间再说吧

Nodejs Promise的一点记录的更多相关文章

  1. 关于Java8:StreamAPI的一点记录

    关于 Stream ,Functional Interface 的一点记录 stream对于集合操作的便捷度提升: import java.util.ArrayList; import java.ut ...

  2. 对Integer类中的私有IntegerCache缓存类的一点记录

    对Integer类中的私有IntegerCache缓存类的一点记录 // Integer类有内部缓存,存贮着-128 到 127. // 所以,每个使用这些数字的变量都指向同一个缓存数据 // 因此可 ...

  3. 从symbol link和hard link 到 unlink函数的一点记录

    之前一直对Linux的文件类型中的 “l” 类型的了解不是很深入,最近经过“圣经”指点,略知一二,在此先记录一下,以便以后查阅,之后会对文件和目录.文件I/O这部分再扩充. 首先需明确,Unix在查阅 ...

  4. 读《nodejs开发指南》记录

    最近看了一下<nodejs开发指南>发现nodejs在某些特定的领域由他自己的长处,适合密集计算但是业务逻辑比较简单的场景,如果做网站还是选择php吧,呵呵,这本书我除了第5章<用n ...

  5. Promise的一点感悟~

    在什么大环境下? 今天要讨论的Promise,是js的同步|异步任务的概念下出来的 什么是同步?什么是异步? 我的理解: 一件事情Q 分三部分:Q1 ,  Q2  ,  Q3 同步方式完成: Q1 - ...

  6. Centos下Nodejs+npm环境-部署记录

    公司的一个项目上线,需要用到Nodejs和npm环境,这里记录下安装过程,方便回看同时供大家参考. 1)yum安装方式(版本比较老点,v5.12.0 + 3.8.6) 需要在centos中添加epel ...

  7. 关于删除MySQL Logs的一点记录

    五一前,一个DBA同事反馈,在日常环境中删除一个大的slow log文件(假设文件大小10G以上吧),然后在MySQL中执行flush slow logs,会发现mysqld hang住. 今天尝试着 ...

  8. 关于类属性值校验的一点记录 【知识点Attribute】

    好久没有进来了,之前励志坚持写博客,记录自己在做代码搬运工这段历程中点滴,可是仅仅只坚持了几天,就放弃了!果然是,世上无难事,只要肯放弃!哈哈……闲话不多说,开始进入正题,给自己留点笔记,避免将来老了 ...

  9. 【.Net】关于内存缓存的一点记录

    引言 最近看了内存缓存的一些介绍和用法,在此做个简单记录. MemoryCache 类 MemoryCache 类是.Net 4.0推出的类库,主要是为了方便在Winform和Wpf中构建缓存框架的. ...

随机推荐

  1. Git使用教程

    配置Git 首先在本地创建ssh key: $ ssh-keygen -t rsa -C "your_email@youremail.com" 后面的your_email@your ...

  2. (三)Netty源码学习笔记之boss线程处理流程

    尊重原创,转载注明出处,原文地址:http://www.cnblogs.com/cishengchongyan/p/6160194.html  本文我们将先从NioEventLoop开始来学习服务端的 ...

  3. AnyImgUpload

    @{ ViewBag.Title = "ImgForAny"; Layout = null; } <h2>ImgForAny</h2> <script ...

  4. sh 测试网段在线主机

    yum install nmap nmap -sP  192.168.21.1/24 查看网段在线主机 grep -vwf file1 file2 文件内容比较 #!/bin/bash # day=` ...

  5. Linux系统开机默认开启无线网卡

    Linux系统每次重新启动时,不会重新打开无线网卡,需要每次手动去更改. 这里通过两种方式开启无线网卡. 第一种方式就是手动连接到Linux系统,(前提是按照了Linux桌面) 1.找到文件夹为 et ...

  6. 数据库SQL语句优化小结

    网上查找的总结: 1.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null ...

  7. 多个html怎么导入相同的头部导航

    1. iframe 包含法.页头和页尾分别做成一个页面,然后通过iframe嵌入到调用的页面.这种方法在页头页尾高度固定的时候比较适用,因为当页头页尾高度不固定时,需要iframe根据页面内容自适应高 ...

  8. Document对象操作、样式、属性、效果、

    Windows对象主要是操作浏览器外层的东西,而DOM对象是操作浏览器里面的东西. 如果我们要操作网页内容,那么一定需要操作标签! Document:文档对象模型→DOM:可以做一些特效(抢票的).摘 ...

  9. 记一次proc_open没有开启心得感悟

    引言: 今天在部署服务器的时候,使用composer来安装依赖.遇到了 The Process class relies on proc_open, which is not available on ...

  10. 我的基于asp.net mvc5 +mysql+dapper+easyui 的Web开发框架(1)数据库访问(0)

    一.数据库访问 概述 1. 数据库使用mysql,orm采用dapper框架.dapper框架应用简单,只是需要自己手写sql语句,但是对于像我这样写了多年sql语句的人来说,这应该不算问题,个人还是 ...