Nodejs Promise的一点记录
项目需要,看了点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的一点记录的更多相关文章
- 关于Java8:StreamAPI的一点记录
关于 Stream ,Functional Interface 的一点记录 stream对于集合操作的便捷度提升: import java.util.ArrayList; import java.ut ...
- 对Integer类中的私有IntegerCache缓存类的一点记录
对Integer类中的私有IntegerCache缓存类的一点记录 // Integer类有内部缓存,存贮着-128 到 127. // 所以,每个使用这些数字的变量都指向同一个缓存数据 // 因此可 ...
- 从symbol link和hard link 到 unlink函数的一点记录
之前一直对Linux的文件类型中的 “l” 类型的了解不是很深入,最近经过“圣经”指点,略知一二,在此先记录一下,以便以后查阅,之后会对文件和目录.文件I/O这部分再扩充. 首先需明确,Unix在查阅 ...
- 读《nodejs开发指南》记录
最近看了一下<nodejs开发指南>发现nodejs在某些特定的领域由他自己的长处,适合密集计算但是业务逻辑比较简单的场景,如果做网站还是选择php吧,呵呵,这本书我除了第5章<用n ...
- Promise的一点感悟~
在什么大环境下? 今天要讨论的Promise,是js的同步|异步任务的概念下出来的 什么是同步?什么是异步? 我的理解: 一件事情Q 分三部分:Q1 , Q2 , Q3 同步方式完成: Q1 - ...
- Centos下Nodejs+npm环境-部署记录
公司的一个项目上线,需要用到Nodejs和npm环境,这里记录下安装过程,方便回看同时供大家参考. 1)yum安装方式(版本比较老点,v5.12.0 + 3.8.6) 需要在centos中添加epel ...
- 关于删除MySQL Logs的一点记录
五一前,一个DBA同事反馈,在日常环境中删除一个大的slow log文件(假设文件大小10G以上吧),然后在MySQL中执行flush slow logs,会发现mysqld hang住. 今天尝试着 ...
- 关于类属性值校验的一点记录 【知识点Attribute】
好久没有进来了,之前励志坚持写博客,记录自己在做代码搬运工这段历程中点滴,可是仅仅只坚持了几天,就放弃了!果然是,世上无难事,只要肯放弃!哈哈……闲话不多说,开始进入正题,给自己留点笔记,避免将来老了 ...
- 【.Net】关于内存缓存的一点记录
引言 最近看了内存缓存的一些介绍和用法,在此做个简单记录. MemoryCache 类 MemoryCache 类是.Net 4.0推出的类库,主要是为了方便在Winform和Wpf中构建缓存框架的. ...
随机推荐
- Android studio安装
1.首先上甲骨文公司的官方网站下载JDK的安装包,根据自己电脑的操作系统选择正确的版本下载.不知道下载地址的同学可以百度一下很快就能搜到.下载还的安装包如下图所示. 2.点击下载好的JDK安装程序,百 ...
- javaWeb项目中如何实现在线查看pdf文件
最近有需求要实现在网页直接查看pdf,word,excel文件.但是实际当中并没有很好的开源插件供我们使用,确实有一些付费的插件不错,也很好用,但是对于我来说都不适合. 现在只是单纯的找到了围魏救赵的 ...
- ViewPager适配器FragmentStatePagerAdapter 与FragmentPagerAdapter
使用FragmentPagerAdapter存在删除dataSet顺序错乱的问题 改用FragmentStatePagerAdapter
- Lintcode 166. 链表倒数第n个节点
----------------------------------- 最开始的想法是先计算出链表的长度length,然后再从头走 length-n 步即是需要的位置了. AC代码: /** * De ...
- MVC 解决 readonly 问题
<input type="text" class="form-control" name="UR_UserName" value=&q ...
- jquery lazyload延迟加载技术的实现原理分析
懒加载技术(简称lazyload)并不是新技术,它是js程序员对网页性能优化的一种方案.lazyload的核心是按需加载.在大型网站中都有lazyload的身影,例如谷歌的图片搜索页,迅雷首页,淘宝网 ...
- 安装spark ha集群
安装spark ha集群 1.默认安装好hadoop+zookeeper 2.安装scala 1.解压安装包 tar zxvf scala-2.11.7.tgz 2.配置环境变量 vim /etc/p ...
- mac版Camtasia 2.10破解
Camtasia是非常好用的一款录屏.视频编辑.制作的软件.但是这么一款优秀的软件只有30天的试用期,试用期过后便不能使用. 目前网上的破解办法几乎都属于同一种办法: http://www.orsoo ...
- D3数据绑定
这里转载一个非常经典的关于D3数据绑定的帖子,由D3作者自己写的,非常棒,以至于我忍不住全文copy到此. 原文地址 Thinking with Joins Say you’re making a b ...
- 【CentOS】LAMP
文章需要整合,学习需要归纳,博主把一连四篇的LAMP合并成为一片长篇的大部头,并梳理了一下他们的关系,希望对各位有所帮助 最近一次更新:2016年12月21日21:38:31 本文为博主JerryCh ...