首页 > 代码库 > Nodejs Promise的一点记录
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的一点记录
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。