V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
magicdawn
V2EX  ›  Node.js

promise 工具包分享

  •  
  •   magicdawn · 2016-05-17 22:42:56 +08:00 · 3132 次点击
    这是一个创建于 2872 天前的主题,其中的信息可能已经有所发展或是发生改变。

    原帖发在 CNode.js 论坛上, 见 https://cnodejs.org/topic/573b2d64fcf698421d20359d


    听说 v8 已经着手实现 async/await 了, 可喜可贺

    分享一波 promise 工具集

    promise.map

    跟 bluebird promise.map 一样的功能, 提供 concurrency, 这个实现的核心代码抄自很久之前的 async.parallelLimit https://github.com/magicdawn/promise.map

    var map = require('promise.map');
    var p = map(arr, function(item, index, arr){
      return getOtherPromise(item);
    }, concurrency);
    

    promise.delay

    还是跟 bluebird 的功能一致, 实现一个 sleep 功能 https://github.com/magicdawn/promise.delay

    const sleep = require('promise.delay');
    sleep(100).then(function(){
      // blabla
    });
    

    promise.obj

    类似 bluebird Promise.props, 实现 object 版本的 Promise.all https://github.com/magicdawn/promise.obj

    const pobj = require('promise.obj');
    
    const p = pobj({
      x: Promise.resolve('x'),
      y: Promise.resolve('y')
    });
    
    p.then(function(o){
      o.x // 'x'
      o.y // 'y'
    })
    

    promise.retry

    给一个异步函数, 增加重试功能, 支持普通错误 & 超时错误. 这个貌似 bluebird 里面没有? https://github.com/magicdawn/promise.retry

    const pretry = require('promise.retry');
    const TimeoutError = pretry.TimeoutError;
    const RetryError = pretry.RetryError;
    const fnWithRetry = pretry(fn, options);
    

    promise.timeout

    给一个异步函数加上超时处理 https://github.com/magicdawn/promise.timeout

    var ptimeout = require('promise.timeout');
    
    // a function will cost 20ms
    function test() {
      return new Promise(function(resolve, reject) {
        setTimeout(function() {
          resolve(20);
        }, 20);
      });
    }
    
    const test10 = ptimeout(test, 10);
    const test50 = ptimeout(test, 50);
    
    // 10 timeout
    try {
      yield test10();
    } catch (e) {
      e.should.be.ok();
      e.should.be.instanceof(ptimeout.TimeoutError);
      e.message.should.match(/timeout/);
      e.timeout.should.equal(10);
    }
    
    // 50 ok
    const _50 = yield test50();
    _50.should.be.ok();
    _50.should.equal(20);
    

    promise.ify

    类似 bluebird Promise.promisify, 支持简单的 promiseifyAll, 以及 noerr 处理没有 err 的 callback 情况 https://github.com/magicdawn/promise.ify

    var promiseify = require('promise.ify');
    var readFile = promiseify(fs.readFile, fs);
    
    var Connection = require('mysql/lib/Connection');
    promiseify.all(Connection.prototype);
    

    好的, 为什么实现 bluebird 那些方法呢, 因为不想绑死在 bluebird 上, 有一些原因要去掉 bluebird 的时候不会因为它的一些有用的方法而舍不得. 有了这些小工具库,可以选择任意 Promise A+ 实现哦~都是使用的 global.Promise

    注意 promise.retry 使用了 generator, 目标环境为 ES6, 其他的包都是 target 到 ES5 的, 就是 browserify or webpack 直接 require 即可, 不需要再次编译.

    3 条回复    2016-05-19 09:49:50 +08:00
    magicdawn
        1
    magicdawn  
    OP
       2016-05-17 22:44:36 +08:00
    几个都是 0 star. 不过不要因为这个就产生顾虑, 他们都是 100% coverage 的.
    magicdawn
        2
    magicdawn  
    OP
       2016-05-19 09:49:42 +08:00
    发出来还是 0 star ... 看来我真是自娱自乐
    magicdawn
        3
    magicdawn  
    OP
       2016-05-19 09:49:50 +08:00
    :joy:
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2884 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 13:06 · PVG 21:06 · LAX 06:06 · JFK 09:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.