{"_id":"@blueking/combine-request","_rev":"3-ee212eb5a2e0625d1b5f632053301bcc","name":"@blueking/combine-request","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"name":"@blueking/combine-request","version":"1.0.0","author":{"name":"Tencent BlueKing"},"license":"MIT","_id":"@blueking/combine-request@1.0.0","maintainers":[{"name":"blueking","email":"contactus_bk@tencent.com"}],"dist":{"shasum":"9a5ab877a53825adc925d9c3e4d88982ab635938","tarball":"https://registry.npmjs.org/@blueking/combine-request/-/combine-request-1.0.0.tgz","fileCount":5,"integrity":"sha512-3xbxVU27DEfJkfJ45wjoMWS2J8Uk1bNjn9ZkzziWq2HogTw/OtevDSM3nDZKwS+6URL41Vg1dOxY4dTupSamaw==","signatures":[{"sig":"MEQCIGP93AQxb+g1qOn2cwsJ8wlcUvA7gNJKTFDXSd32oCmGAiBPJPkahSCDcisvhoqWYXS2TNc6cZWVoHv/61xSMlQVhw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":10777},"main":"./dist/combine-request.js","type":"module","types":"./typings/combine-request.d.ts","module":"./dist/combine-request.js","exports":{".":{"types":"./typings/combine-request.d.ts","import":"./dist/combine-request.js","require":"./dist/combine-request.umd.cjs"}},"gitHead":"944ce8db531a5fbdc3f8b296d7b1cf93757ca76b","scripts":{"dev":"vite","dts":"tsc --project tsconfig.dts.json","build":"vite build","prettier":"prettier ./src ./playground --write","prepublishOnly":"run-p build dts"},"_npmUser":{"name":"blueking","email":"contactus_bk@tencent.com"},"_npmVersion":"9.8.1","description":"合并请求通用工具类，适用于组件拆分但希望合并数据请求场景，同时可用于控制异步方法分片执行。","directories":{},"_nodeVersion":"18.18.0","dependencies":{"lodash":"^4.17.21"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.2.0","axios":"^1.7.4"},"_npmOperationalInternal":{"tmp":"tmp/combine-request_1.0.0_1733297867185_0.3739183297372166","host":"s3://npm-registry-packages"}},"1.0.1":{"name":"@blueking/combine-request","version":"1.0.1","author":{"name":"Tencent BlueKing"},"license":"MIT","_id":"@blueking/combine-request@1.0.1","maintainers":[{"name":"blueking","email":"contactus_bk@tencent.com"}],"dist":{"shasum":"e48c1b22a698ece8b90e2aadb8bb83bbfbd165ed","tarball":"https://registry.npmjs.org/@blueking/combine-request/-/combine-request-1.0.1.tgz","fileCount":5,"integrity":"sha512-MYFfvvxt8xhEQm/IfkIegu7OF95goI9Tkr+ytsms/HQpjP4nYDCfFThHKf9IekiBQMpzber8FnoBYD1X79kzpw==","signatures":[{"sig":"MEYCIQDfu5cxTxr/G+A17K5NOCHk0hF2r8+dMw8idlkzzVNKYQIhAJh6NPetkeIt5fWhmfgwfKDpHnA6DN7DjEhoJu6Op2DP","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":12051},"main":"./dist/combine-request.js","type":"module","types":"./typings/combine-request.d.ts","module":"./dist/combine-request.js","exports":{".":{"types":"./typings/combine-request.d.ts","import":"./dist/combine-request.js","require":"./dist/combine-request.umd.cjs"}},"gitHead":"84fc2513fe575b21327863b52f600c69ee3d7875","scripts":{"dev":"vite","dts":"tsc --project tsconfig.dts.json","build":"vite build","prettier":"prettier ./src ./playground --write","prepublishOnly":"run-p build dts"},"_npmUser":{"name":"blueking","email":"contactus_bk@tencent.com"},"_npmVersion":"9.8.1","description":"合并请求通用工具类，适用于组件拆分但希望合并数据请求场景，同时可用于控制异步方法分片执行。","directories":{},"_nodeVersion":"18.18.0","dependencies":{},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.2.0","axios":"^1.7.4"},"_npmOperationalInternal":{"tmp":"tmp/combine-request_1.0.1_1733361801794_0.6515342631493131","host":"s3://npm-registry-packages"}}},"time":{"created":"2024-12-04T07:37:47.043Z","modified":"2026-01-15T04:03:44.355Z","1.0.0":"2024-12-04T07:37:47.394Z","1.0.1":"2024-12-05T01:23:22.077Z"},"author":{"name":"Tencent BlueKing"},"license":"MIT","description":"合并请求通用工具类，适用于组件拆分但希望合并数据请求场景，同时可用于控制异步方法分片执行。","maintainers":[{"email":"contactus_bk@tencent.com","name":"blueking-magicbox"}],"readme":"# combine-request\n\n合并请求通用工具类，适用于组件拆分但希望合并数据请求场景，同时可用于控制异步方法分片执行。\n理论上，此工具实现的是一个延时执行模型，即执行目标可以是异步请求或者任何普通函数，编排后的执行可由使用方自行处理。\n\n# 安装\n\n```bash\nnpm install @blueking/combine-request\n```\n\n# 使用\n\n## 实例化\n```js\ninterface IDataItem {\n  id: number;\n  name: string;\n}\n\nconst combineRequest = new CombineRequest<IDataItem[]>(\n  data => {\n    console.log(data); // 合并起来的所有参数数据\n    return new Promise(resolve => {\n      setTimeout(() => {\n        resolve([{ id: 1, name: '1' }]);\n      }, 1000);\n    });\n  },\n  2, // 参数分段大小，可选\n  2, // 迸发大小，可选\n);\n```\n\n## 单例模式，在同一组件中发起请求调用时非常有用\n```js\n// 假设 comp.vue 中在页面中被使用10次，组件中存在以下调用\nconst combineRequestInstance = CombineRequest.setup<IDataItem[]>(Symbol.for('myCombineRequest'), data => {\n  console.log(data);\n  return new Promise(resolve => {\n    setTimeout(() => {\n      resolve([{ id: 1, name: '1' }]);\n    }, 3000);\n  });\n});\n\ncombineRequestInstance.add(Math.random())\n\n// 最终将确保回调只执行1次，data参数为10个Math.random()元素数组\n(10) [0.7344740349564569, 0.19415064068295118, 0.1062907681339258, 0.4052586915078804, ...]\n```\n\n## getPromise 参数不分段、不控制迸发时使用\n```js\nconst combineRequest = new CombineRequest<IDataItem[]>(data => {\n  console.log(data);\n  return new Promise(resolve => {\n    setTimeout(() => {\n      resolve([{ id: 1, name: '1' }]);\n    }, 1000);\n  });\n});\n\ncombineRequest.add(1)\ncombineRequest.add(2)\ncombineRequest.add(3)\n\nlet i = 4;\nwhile (i < 10) {\n  combineRequest.add(i);\n  i++;\n}\n\nconsole.log(await combineRequest.getPromise());\n\n// 收集到的所有参数\n(9) [1, 2, 3, 4, 5, 6, 7, 8, 9]\n\n// 输出结果，1次完成调用\n[\n    {\n        \"id\": 1,\n        \"name\": \"1\"\n    }\n]\n```\n\n## getSplitPromise 参数分段、不控制迸发时使用\n```js\nconst combineRequest = new CombineRequest<IDataItem[]>(data => {\n  console.log(data);\n  return new Promise(resolve => {\n    setTimeout(() => {\n      resolve([{ id: 1, name: '1' }]);\n    }, 1000);\n  });\n}, 2);\n\ncombineRequest.add(1)\ncombineRequest.add(2)\ncombineRequest.add(3)\n\nlet i = 4;\nwhile (i < 10) {\n  combineRequest.add(i);\n  i++;\n}\n\nfor (const result of await combineRequest.getSplitPromise()) {\n  console.log(await result);\n}\n\n// 参数根据2个一组拆分，需要5次执行完成调用\n(2) [1, 2]\n(2) [3, 4]\n(2) [5, 6]\n(2) [7, 8]\n[9]\n\n// 对应5次执行的结果\n[{…}]\n[{…}]\n[{…}]\n[{…}]\n[{…}]\n```\n\n## getSlicePromise 参数分段、控制迸发时使用\n\n```js\nconst combineRequest = new CombineRequest<IDataItem[]>(\n  data => {\n    console.log(data);\n    return new Promise(resolve => {\n      setTimeout(() => {\n        resolve([{ id: 1, name: '1' }]);\n      }, 3000);\n    });\n  },\n  2,\n  2,\n);\n\ncombineRequest.add(1)\ncombineRequest.add(2)\ncombineRequest.add(3)\n\nlet i = 4;\nwhile (i < 10) {\n  combineRequest.add(i);\n  i++;\n}\n\nfor (const q of await combineRequest.getSlicePromise()) {\n  console.time('time');\n  const x = await q;\n  for (const y of x) {\n    if (y.status === 'fulfilled') {\n      y.value.forEach(v => {\n        console.timeEnd('time');\n        console.log(v);\n      });\n    } else {\n      console.log(y.reason);\n    }\n  }\n}\n\n// 参数根据2个一组拆分，需要5次执行完成调用，但调用并不是一次性全部触发的，而是按2次一个迸发控制执行的\n(2) [1, 2]\n(2) [3, 4]\ntime: 3001.669189453125 ms\n{id: 1, name: '1'}\n{id: 1, name: '1'}\n\n// 每次迸发2个，在上一次调用执行完成之后才继续下一次\n(2) [5, 6]\n(2) [7, 8]\ntime: 3000.383056640625 ms\n{id: 1, name: '1'}\n{id: 1, name: '1'}\n\n[9]\ntime: 3001.5419921875 ms\n{id: 1, name: '1'}\n\n// waterfall示意\n-----\n-----\n     -----\n     -----\n          -----\n```","readmeFilename":"README.md"}