zoukankan      html  css  js  c++  java
  • 对bluebird的理解

    前言

    Promise:把原来的回调写法分离出来,在异步操作执行完后,用链式调用的方式执行回调函数。

    在公众号的开发里面用的const Promise = require('bluebird');const request = Promise.promisify(require('request'));这两句代码,之前一直没弄明白是啥意思,后来发现这是将callback函数重新用promise来实现。

    什么是 promisify和promisifyAll

    promisify 就是把带有 callback 函数,变成重新用 promise 来实现的一种技术方案,它能一劳永逸的解决:如何把函数都用 promise 重新实现的问题。

    如果说 promisify 只能一次转一个函数,那 promisifyall 的作用就是一次把一个库的文件转完。

    怎么使用

    const Promise = require('bluebird');

    const **= Promise.promisify(require('**'));

    promisify

    prmoisify的作是:将一个 nodeCallback 形式函数调用转为 promise

    这里需要解释一下: nodeCallback 是什么意思。

    nodeCallbackNodejs 中的一个常用词。表达是意思是:Nodejs 中,以错误优先的回调函数的总称。

    它包括两个意思:

    1. nodeCallback 回调函数签名。
    2. nodeCallBack 回调函数出现的位置。

    nodeCallback 签名

    该回调函数的签名__一定__是这样:

    // 这样是对的
    function fooCallBack(err, a, b){
      // something
      console.log(a,b);
    }
    
    // 这样不对
    function foo1CallBack(a,b,err){
      
    }
    可以看到,fooCallBack 函数的调用参数中,第一个参数是: err, 也就是说的 noodeCallBack 函数的第一个参数__一定__传入的是 err ,而不能是别的参数。只要满足了这个条件,都可叫 nodeCallback

    nodeCallBack 出现的顺序

    nodeCallBack 一定出现在异步函数的最后一个,也就是这样:

    // 这样是对的。
    function foo(a,b,nodeCallback){
      // pass
    }
    
    // 这样就不是 nodeCallback
    function foo(a,nodeCallback,b){
      // pass
    }

    只要满足了签名和顺序,就可以叫做 nodeCallBack

    nodeCallback 存在哪里呢?告诉你吧,所有的 NodeJS 标准包中异步的地方都是它。

    好了说了这么多 nodeCallback,现在来说说 promosify 怎样使用:

    const Promise = require('bluebird');
    const fs = require('fs');
    
    // 回调形式,这里的callback 就是 nodeCallback
    fs.readFile('./test.js',function(err,data){
      console.log(data);
    });
    
    // promisify 形式
    const readFileAsync = Promise.promisify(fs.readFile);
    
    readFileAsync('./test.js').then(function(data){
      console.log(data);
    }).catch(console.log);

    很简单吧。具体实现就不说了,想要了解的去 google 吧。

    promisifyAll

    如果说 promisify 只能一次转一个函数,那 promisifyall 的作用就是一次把一个库的文件转完。

    说的更清楚一点,promisifyall 能把一个库中有函数全部变成 promise 的形式,改变后的函数都带上了 Async 的后缀。看代码:

    const Promise = require('bluebird');
    
    const fs = Promise.promisifyAll(require('fs'));
    
    fs.readFileAsync('./test.js').then(function(data){
      console.log(data);
    }).catch(console.log);

    从上面可以知道:fs 这个标准库,经过 promisifyall , 所有的函数都已经被 promise 化了。而被 promise 化的函数名变成了:原来的函数名+Async

    结论

    当学会使用 promisify 和 promisifyAll 这两个方法,我相信大家以后都对:如何把函数都用promise方式实现? 这样的问题胸有成竹了吧。

    参考博客:https://cnodejs.org/topic/576f9b5dd3baaf401780bba2

  • 相关阅读:
    Hadoop
    Mapreduce
    ssh原理
    HDFS
    Centos
    创建jira插件
    新型的领导者是一名推动者,而不是一名发号施令者
    上善若水,虚怀若谷
    GoAhead 嵌入式web
    Eclipse基金会
  • 原文地址:https://www.cnblogs.com/TomAndJerry/p/9407331.html
Copyright © 2011-2022 走看看