zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    linux系统中如何进入退出vim编辑器,方法及区别
    [转]JAVA的动态代理机制及Spring的实现方式
    mybaties 缓存
    全面分析 Spring 的编程式事务管理及声明式事务管理
    面试(4)-spring-Spring面试题和答案
    vector的多套遍历方案
    【QT】QT下载与安装
    【QT】无需写connect代码关联信号和槽函数
    【QT】第一个QT程序(点击按钮,显示特定文本)
    【QT】error: 'SIGNAL' was not declared in this scope
  • 原文地址:https://www.cnblogs.com/cool-fire/p/6255117.html
Copyright © 2011-2022 走看看