{"_id":"next.js","_rev":"12-401586329f6e3abad64fb0e35d7a7505","name":"next.js","description":"a tiny library for callback style async programing","dist-tags":{"latest":"1.0.3"},"versions":{"1.0.0":{"name":"next.js","description":"a tiny library for callback style async programing","version":"1.0.0","homepage":"http://youngjay.github.com/next","author":{"name":"Yang Jie","email":"hiyoungjay@gmail.com"},"keywords":["async","callback"],"main":"./index.js","_npmUser":{"name":"youngjay","email":"hiyoungjay@gmail.com"},"_id":"next.js@1.0.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"7c5de4efa8fca1e4444554c2bfe7159f8e7e0a2a","tarball":"https://registry.npmjs.org/next.js/-/next.js-1.0.0.tgz","integrity":"sha512-AMpcLwLkHLA131XcLqqpeDJvOoB9F66PYIZ8ODqEnTSegp7A6CmDXCKRZ9vGn5eHcfHEI0Bi570Dh2Z4EF6djw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAIE6wbrGcbb+BCOv1EOrolcQfyjGwcYazoUo/x+Bdj5AiEAxkWpgOdZO3tsD+UkbDG23kep1aNOnaEosSMoRFXQt5Q="}]},"maintainers":[{"name":"youngjay","email":"hiyoungjay@gmail.com"}],"directories":{}},"1.0.1":{"name":"next.js","description":"a tiny library for callback style async programing","version":"1.0.1","homepage":"http://youngjay.github.com/next","author":{"name":"Yang Jie","email":"hiyoungjay@gmail.com"},"keywords":["async","callback"],"main":"./index.js","_npmUser":{"name":"youngjay","email":"hiyoungjay@gmail.com"},"_id":"next.js@1.0.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"7a8a8aaf6a320a9293e86969049719355d99aa15","tarball":"https://registry.npmjs.org/next.js/-/next.js-1.0.1.tgz","integrity":"sha512-MVTWd/7NzXdTHDmFpivgwY3GI9rFS9xyeLL0FADUvFYj+/Kren1OdykiBnbtNA6U8z+oP8pJDYG50fvfSa4AFQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDrc5WE4CwTXas8snHhqSpJSvhj+OcVz8PJMzEpoHzIxAIgMLRNRGRx8YI507qXLT+/3+/AodB+p8VeR4aZ8zsdla0="}]},"maintainers":[{"name":"youngjay","email":"hiyoungjay@gmail.com"}],"directories":{}},"1.0.2":{"name":"next.js","description":"a tiny library for callback style async programing","version":"1.0.2","homepage":"http://youngjay.github.com/next","author":{"name":"Yang Jie","email":"hiyoungjay@gmail.com"},"keywords":["async","callback"],"main":"./index.js","_npmUser":{"name":"youngjay","email":"hiyoungjay@gmail.com"},"_id":"next.js@1.0.2","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"8545a280c2b175e81d802a51cacdae567150af14","tarball":"https://registry.npmjs.org/next.js/-/next.js-1.0.2.tgz","integrity":"sha512-npr9jDOaV1Ne2sCu/ww2Zm62tMTPkwWgvEenQEEa14MbIAb1rnTLwUnu3MOBY4CJicouAyQu00y0uOcRkhFxnA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID/s9a7J1quLS7pLxAvygkh//iQhvl+HgdIggpPhgmDYAiEAiNdwBfRkA4+Dq0GR7KL5dnVi1BC148QbzMDVnYr2oFI="}]},"maintainers":[{"name":"youngjay","email":"hiyoungjay@gmail.com"}],"directories":{}},"1.0.3":{"name":"next.js","description":"a tiny library for callback style async programing","version":"1.0.3","homepage":"http://youngjay.github.com/next","author":{"name":"Yang Jie","email":"hiyoungjay@gmail.com"},"keywords":["async","callback"],"main":"./index.js","dist":{"shasum":"b7d5a4c6e241c3d914c94007aa4f31d108799fa8","tarball":"https://registry.npmjs.org/next.js/-/next.js-1.0.3.tgz","integrity":"sha512-nosnT7Jh4ML3kzwG9MPW+SfBKuHoZEMcCWw5kxwMYXoxnADGzIxWl+TdDMcEZP6Xl/t8m/5uyVlA9SBkH2oh/w==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDB55szBh673FX0717C67ms8EGNKGK/sYNEUUzmjq4sywIgQpJqI9LXz9i9mKx0bLLOrO0UoR6o0BI1E3IGAHDaY80="}]},"readme":"# next\r\n\r\nnext 是一个为callback风格的异步编程提供支持的工具库。\r\nnext和[Async.js](https://github.com/caolan/async)的不同之处在于：async是调用函数, next是生成函数\r\n\r\n\r\n\r\n## 优势\r\n* 函数复用--\r\n针对函数而不是针对过程，可以对函数进行组合和连接。采用node风格的callback机制，直接可以复用系统函数。\r\n\r\n* 扁平化callback层次--\r\n使用next.pipe(fn1, fn2, fnN)连接函数，扁平化callback层次。\r\n\r\n* 统一的异常处理--\r\n在pipe、map、parallel等方法中进行组合的函数，一旦发生异常，则会统一跳到运行时传入callback进行处理，不用重复判断每级的error。\r\n\r\n## API\r\n\r\n### pipe([fn1], [fn2], [fnN])\r\n生成一个函数，先调用fn1，完成之后以fn1的返回值调用fn2，以此类推。\r\n在调用的时候如果有异常，直接跳到运行时传入的callback\r\n\r\n```javascript\r\nvar add2 = next.pipe(\r\n  function(num, callback) { callback(null, num + 1, num + 2) },\r\n  function(num1, num2, callback) { callback(null, num1 + 3, num2 + 3) }\r\n);\r\n\r\nadd2(1, function() {\r\n  console.log(arguments);\r\n});\r\n\r\n// result: [null, 5, 6]\r\n```\r\n\r\n### map(fn)\r\n生成一个函数，遍历入参每一个元素，调用fn。收集完结果之后按照传入顺序返回。\r\n```javascript\r\nvar addEach = next.map(\r\n  function(num, callback) { callback(null, num + 1) }\r\n);\r\n\r\naddEach([1,2,3], function() {\r\n  console.log(arguments);\r\n});\r\n// result: [null, [2,3,4]]\r\n\r\n```\r\n\r\n### parallel(fn1, [fn2], [fnN])\r\n生成一个函数，以当前参数调用每个fn，收集结果之后返回\r\n```javascript\r\nvar parallelAction = next.parallel(\r\n  function(num, callback) { callback(null, num + 1) },\r\n  function(num, callback) { callback(null, num + 2) }\r\n);\r\n\r\nparallelAction(1, function() {\r\n  console.log(arguments);\r\n});\r\n// result: [null, 2,3]\r\n\r\n```\r\n\r\n### concurrency(fn, limit, [onDrain])\r\n生成一个函数，使得同时运行的fn不超过limit个，超过的调用将被缓存，当有fn执行完毕之后再执行。当所有的fn调用完毕时触发onDrain\r\n```javascript\r\nvar throttledRunner = next.concurrency(function(a, callback) {\r\n  console.log('start:' + a);\r\n  setTimeout(function() {\r\n    console.log('end:' + a);\r\n    callback(a);\r\n  }, Math.random() * 3000);\r\n}, 5, function() {\r\n  console.log('drain');\r\n});\r\n\r\nfor (var i = 0; i < 1000; i++) {\r\n  throttledRunner(i, function() {});\r\n}\r\n\r\n```\r\n\r\n### attempt([fn1], [fn2], [fnN])\r\n顺序尝试fn1到fnN，直到当有一个成功，返回值\r\nnext.attempt(\r\n  function(a, callback) {\r\n    callback(1);\r\n  }, \r\n  function(a, callback) {\r\n    callback(null, 2)\r\n  }, \r\n  function(a, callback) {\r\n    callback(3)\r\n  }\r\n)('error', function() {\r\n  console.log(arguments)\r\n})\r\n\r\n//result: [null, 2] \r\n\r\n```\r\n\r\n## 一些功能示例\r\n### [compress](https://github.com/youngjay/next/blob/master/examples/compress/compress.js)\r\n从页面上读取script标签src -> 获取js文件内容 -> 调用uglify-js压缩 -> 写文件\r\n\r\n","_id":"next.js@1.0.3","maintainers":[{"name":"youngjay","email":"hiyoungjay@gmail.com"}],"directories":{}}},"readme":"# next\n\nnext 是一个为callback风格的异步编程提供支持的工具库。\nnext和[Async.js](https://github.com/caolan/async)的不同之处在于：async是调用函数, next是生成函数\n\n\n\n## 优势\n* 函数复用--\n针对函数而不是针对过程，可以对函数进行组合和连接。采用node风格的callback机制，直接可以复用系统函数。\n\n* 扁平化callback层次--\n使用next.pipe(fn1, fn2, fnN)连接函数，扁平化callback层次。\n\n* 统一的异常处理--\n在pipe、map、parallel等方法中进行组合的函数，一旦发生异常，则会统一跳到运行时传入callback进行处理，不用重复判断每级的error。\n\n## API\n\n### pipe([fn1], [fn2], [fnN])\n生成一个函数，先调用fn1，完成之后以fn1的返回值调用fn2，以此类推。\n在调用的时候如果有异常，直接跳到运行时传入的callback\n\n```javascript\nvar add2 = next.pipe(\n  function(num, callback) { callback(null, num + 1, num + 2) },\n  function(num1, num2, callback) { callback(null, num1 + 3, num2 + 3) }\n);\n\nadd2(1, function() {\n  console.log(arguments);\n});\n\n// result: [null, 5, 6]\n```\n\n### map(fn)\n生成一个函数，遍历入参每一个元素，调用fn。收集完结果之后按照传入顺序返回。\n```javascript\nvar addEach = next.map(\n  function(num, callback) { callback(null, num + 1) }\n);\n\naddEach([1,2,3], function() {\n  console.log(arguments);\n});\n// result: [null, [2,3,4]]\n\n```\n\n### parallel(fn1, [fn2], [fnN])\n生成一个函数，以当前参数调用每个fn，收集结果之后返回\n```javascript\nvar parallelAction = next.parallel(\n  function(num, callback) { callback(null, num + 1) },\n  function(num, callback) { callback(null, num + 2) }\n);\n\nparallelAction(1, function() {\n  console.log(arguments);\n});\n// result: [null, 2,3]\n\n```\n\n### concurrency(fn, limit, [onDrain])\n生成一个函数，使得同时运行的fn不超过limit个，超过的调用将被缓存，当有fn执行完毕之后再执行。当所有的fn调用完毕时触发onDrain\n```javascript\nvar throttledRunner = next.concurrency(function(a, callback) {\n  console.log('start:' + a);\n  setTimeout(function() {\n    console.log('end:' + a);\n    callback(a);\n  }, Math.random() * 3000);\n}, 5, function() {\n  console.log('drain');\n});\n\nfor (var i = 0; i < 1000; i++) {\n  throttledRunner(i, function() {});\n}\n\n```\n\n### rescue(fn, rescuer)\nrescuer == (err, callback) -> \n生成一个函数，当发生异常时，由rescuer捕获，而不是跳转到运行时的callback。\nrescuer接受error和callback作为参数，可以选择返回到正常的分支，或者继续抛出异常。\n```javascript\nnext.rescue(function(a, callback) {\n  console.log('raise exception:' + a);\n  callback(a);\n}, function(err, callback) {\n  console.log('rescue exception');\n  callback(null, err + ' is rescued')\n})('error', function() {\n  console.log(arguments)\n})\n\n// result:\n//rescue\n//raise exception:error\n//rescue exception\n\n```\n\n\n### echo()\n辅助函数，直接返回参数\n```javascript\nnext.echo([1,2,3], function() {\n  console.log(arguments);\n});\n// result: [null, [1,2,3]]\n\n```\n\n在parallel的时候，使用echo可以返回原参数\n\n```javascript\nvar parallelAction = next.parallel(\n  next.echo,\n  function(num1, num2, callback) { callback(null, num1 + 1, num2 + 1) },\n  function(num1, num2, callback) { callback(null, num1 + 2, num2 + 2) }\n);\n\nparallelAction(1, 1, function() {\n  console.log(arguments);\n});\n// result: [null, 1, 1, 2, 3, 3]\n\n```\n\n\n## 一些功能示例\n### [compress](https://github.com/youngjay/next/blob/master/examples/compress/compress.js)\n从页面上读取script标签src -> 获取js文件内容 -> 调用uglify-js压缩 -> 写文件\n\n","maintainers":[{"name":"youngjay","email":"hiyoungjay@gmail.com"}],"time":{"modified":"2022-06-21T02:34:53.546Z","created":"2012-05-22T10:24:15.466Z","1.0.0":"2012-05-22T10:24:20.776Z","1.0.1":"2012-05-23T02:15:23.237Z","1.0.2":"2012-05-23T02:31:22.100Z","1.0.3":"2012-08-21T05:31:44.097Z"},"author":{"name":"Yang Jie","email":"hiyoungjay@gmail.com"},"users":{"nberlette":true}}