项目需要,看了点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

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

最新文章

  1. Spark踩坑记——Spark Streaming+Kafka
  2. Android搜索功能的案例,本地保存搜索历史记录......
  3. configparser配置文件操作
  4. error while loading shared libraries:错误的原因和解决方法
  5. 值类型和引用类型(C#基础知识复习)
  6. HTML5塔防游戏——《三国塔防》 - Yorhom's Game Box
  7. MyEclipse 2013官网下载地址以及破解方法
  8. jquery层居中,点击小图查看大图,弹出层居中代码,顶部层固定不动,滚动条滚动情况
  9. JBPM学习(三):管理流程定义
  10. 【C#】组件分享:FormDragger-窗体拖拽器
  11. c#Message多功能用法
  12. Android签名机制---签名过程
  13. EntityFramework Core:版本不一致问题
  14. Android中屏幕保持唤醒
  15. BZOJ3091城市旅行——LCT区间信息合并
  16. 【Ray Tracing The Next Week 超详解】 光线追踪2-6 Cornell box
  17. cdh 安装系列2--cdh manager product 安装
  18. ajax请求跨域
  19. 进程同步(multiprocess.Lock、multiprocess.Semaphore、multiprocess.Event) day38
  20. ZH奶酪:C语言中malloc()和free()函数解析

热门文章

  1. 时间同步ntp服务的安装与配置(作为客户端的配置
  2. [转]jquery mobile中redirect重定向问题
  3. 一个简单的判断浏览器是否为IE9以下的方法
  4. 多功能前台交互效果插件superSlide
  5. nagios检测http
  6. 使用keychain保存用户名和密码等敏感信息 KeychainItemWrapper和SFHFKeychainUtils
  7. PHP发送短信功能
  8. embed chrome 无法播放问题
  9. CA认证原理以及实现(上)
  10. POJ 1979 Red and Black【DFS】