tools-min-ns 1.18.7 → 1.18.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -5,6 +5,8 @@ pnpm i tools-min-ns --save
5
5
  ```
6
6
 
7
7
  # updates
8
+ ## v1.18.8
9
+ fix: RequestUtil handleRequests并发请求优化
8
10
  ## v1.18.7
9
11
  fix: 不需要那么严格的URL正则
10
12
 
@@ -8,7 +8,7 @@ import mgop, { setDefaultHeader } from './mgop';
8
8
  import uniRquestFn from './uniRquest';
9
9
  import jsonpFn, { jsonpRquest as jsonpRquestFn } from './jsonp';
10
10
  import nsPromiseFn from './nsPromiseFn';
11
- export type PromiseInput<T> = Array<(() => Promise<T>) | Promise<T>> | (() => Promise<T>) | Promise<T>;
11
+ export type PromiseInput<T> = (() => Promise<T>)[] | (() => Promise<T>) | Promise<T>;
12
12
  declare namespace RequestUtil {
13
13
  /** @name 浙里办请求工具设置默认请求头 */
14
14
  export const mgopSetDefaultHeader: typeof setDefaultHeader;
@@ -113,6 +113,37 @@ var __generator = this && this.__generator || function (thisArg, body) {
113
113
  };
114
114
  }
115
115
  };
116
+ var __read = this && this.__read || function (o, n) {
117
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
118
+ if (!m) return o;
119
+ var i = m.call(o),
120
+ r,
121
+ ar = [],
122
+ e;
123
+ try {
124
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
125
+ } catch (error) {
126
+ e = {
127
+ error: error
128
+ };
129
+ } finally {
130
+ try {
131
+ if (r && !r.done && (m = i["return"])) m.call(i);
132
+ } finally {
133
+ if (e) throw e.error;
134
+ }
135
+ }
136
+ return ar;
137
+ };
138
+ var __spreadArray = this && this.__spreadArray || function (to, from, pack) {
139
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
140
+ if (ar || !(i in from)) {
141
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
142
+ ar[i] = from[i];
143
+ }
144
+ }
145
+ return to.concat(ar || Array.prototype.slice.call(from));
146
+ };
116
147
  /**
117
148
  * 请求工具
118
149
  * @description
@@ -175,43 +206,52 @@ var RequestUtil;
175
206
  */
176
207
  function handleRequests(requests, options) {
177
208
  return __awaiter(this, void 0, void 0, function () {
178
- // 存储所有请求的结果
179
- // 定义一个递归函数,用于处理请求并控制并发数量
180
209
  function processRequest() {
181
210
  return __awaiter(this, void 0, void 0, function () {
182
- var res, result;
211
+ var resFn, result, progress, error_1;
183
212
  return __generator(this, function (_a) {
184
213
  switch (_a.label) {
185
214
  case 0:
186
- if (!functionArray.length) return [2 /*return*/];
187
- res = functionArray.shift();
188
- if (!res) return [2 /*return*/];
189
- return [4 /*yield*/, res()];
215
+ if (!(functionArray.length > 0)) return [3 /*break*/, 6];
216
+ resFn = functionArray.shift();
217
+ if (!resFn) return [3 /*break*/, 0];
218
+ _a.label = 1;
190
219
  case 1:
191
- result = _a.sent();
192
- // 执行请求并等待其完成
193
- results.push(result);
194
- // 将结果存储
195
- // 递归调用,确保有新的请求补充进去
196
- return [4 /*yield*/, processRequest()];
220
+ _a.trys.push([1, 4,, 5]);
221
+ return [4 /*yield*/, resFn()];
197
222
  case 2:
198
- // 将结果存储
199
- // 递归调用,确保有新的请求补充进去
223
+ result = _a.sent();
224
+ results.push(result); // 顺序由完成顺序决定
225
+ // 更新进度(使用互斥锁确保原子性)
226
+ return [4 /*yield*/, progressLock.acquire()];
227
+ case 3:
228
+ // 更新进度(使用互斥锁确保原子性)
200
229
  _a.sent();
201
230
  loaded += 1;
231
+ progress = loaded / resLength;
202
232
  onUploadProgress === null || onUploadProgress === void 0 ? void 0 : onUploadProgress({
203
233
  total: resLength,
204
234
  loaded: loaded,
205
- progress: loaded / resLength,
235
+ progress: progress,
206
236
  nowResponse: result,
207
- endResponses: results
237
+ endResponses: __spreadArray([], __read(results), false)
208
238
  });
239
+ progressLock.release();
240
+ return [3 /*break*/, 5];
241
+ case 4:
242
+ error_1 = _a.sent();
243
+ // 错误处理(根据需求决定是否抛出或记录)
244
+ console.error('请求失败:', error_1);
245
+ throw error_1;
246
+ case 5:
247
+ return [3 /*break*/, 0];
248
+ case 6:
209
249
  return [2 /*return*/];
210
250
  }
211
251
  });
212
252
  });
213
253
  }
214
- var _a, _b, limit, onUploadProgress, requestArray, functionArray, resLength, results, loaded, concurrent;
254
+ var _a, _b, limit, onUploadProgress, requestArray, functionArray, resLength, results, loaded, progressLock, concurrent;
215
255
  return __generator(this, function (_c) {
216
256
  switch (_c.label) {
217
257
  case 0:
@@ -225,23 +265,48 @@ var RequestUtil;
225
265
  resLength = functionArray.length;
226
266
  results = [];
227
267
  loaded = 0;
268
+ progressLock = new AsyncLock();
228
269
  concurrent = Array.from({
229
270
  length: Math.min(limit, resLength)
230
271
  }, function () {
231
272
  return processRequest();
232
273
  });
233
- // 等待所有并发的请求完成
234
274
  return [4 /*yield*/, Promise.all(concurrent)];
235
275
  case 1:
236
- // 等待所有并发的请求完成
237
276
  _c.sent();
238
277
  return [2 /*return*/, results];
239
- // 返回所有请求的结果
240
278
  }
241
279
  });
242
280
  });
243
281
  }
244
282
  RequestUtil.handleRequests = handleRequests;
283
+ // 互斥锁实现(简化版)
284
+ var AsyncLock = /** @class */function () {
285
+ function AsyncLock() {
286
+ this._locked = false;
287
+ this._queue = [];
288
+ }
289
+ AsyncLock.prototype.acquire = function () {
290
+ var _this = this;
291
+ return new Promise(function (resolve) {
292
+ var _tryAcquire = function tryAcquire() {
293
+ if (!_this._locked) {
294
+ _this._locked = true;
295
+ resolve();
296
+ } else {
297
+ _this._queue.push(_tryAcquire);
298
+ }
299
+ };
300
+ _tryAcquire();
301
+ });
302
+ };
303
+ AsyncLock.prototype.release = function () {
304
+ this._locked = false;
305
+ var next = this._queue.shift();
306
+ if (next) next();
307
+ };
308
+ return AsyncLock;
309
+ }();
245
310
  /**
246
311
  * 封装多个 Promise 方法,返回 [错误, 数据, 停止状态] 格式
247
312
  * @param {Array<Function | Promise> | Function | Promise} input - 返回 Promise 的函数数组或 Promise 数组,或者单个函数或 Promise
@@ -8,7 +8,7 @@ import mgop, { setDefaultHeader } from './mgop';
8
8
  import uniRquestFn from './uniRquest';
9
9
  import jsonpFn, { jsonpRquest as jsonpRquestFn } from './jsonp';
10
10
  import nsPromiseFn from './nsPromiseFn';
11
- export type PromiseInput<T> = Array<(() => Promise<T>) | Promise<T>> | (() => Promise<T>) | Promise<T>;
11
+ export type PromiseInput<T> = (() => Promise<T>)[] | (() => Promise<T>) | Promise<T>;
12
12
  declare namespace RequestUtil {
13
13
  /** @name 浙里办请求工具设置默认请求头 */
14
14
  export const mgopSetDefaultHeader: typeof setDefaultHeader;
@@ -146,6 +146,37 @@ var __generator = this && this.__generator || function (thisArg, body) {
146
146
  };
147
147
  }
148
148
  };
149
+ var __read = this && this.__read || function (o, n) {
150
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
151
+ if (!m) return o;
152
+ var i = m.call(o),
153
+ r,
154
+ ar = [],
155
+ e;
156
+ try {
157
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
158
+ } catch (error) {
159
+ e = {
160
+ error: error
161
+ };
162
+ } finally {
163
+ try {
164
+ if (r && !r.done && (m = i["return"])) m.call(i);
165
+ } finally {
166
+ if (e) throw e.error;
167
+ }
168
+ }
169
+ return ar;
170
+ };
171
+ var __spreadArray = this && this.__spreadArray || function (to, from, pack) {
172
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
173
+ if (ar || !(i in from)) {
174
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
175
+ ar[i] = from[i];
176
+ }
177
+ }
178
+ return to.concat(ar || Array.prototype.slice.call(from));
179
+ };
149
180
  var __importDefault = this && this.__importDefault || function (mod) {
150
181
  return mod && mod.__esModule ? mod : {
151
182
  "default": mod
@@ -216,43 +247,52 @@ var RequestUtil;
216
247
  */
217
248
  function handleRequests(requests, options) {
218
249
  return __awaiter(this, void 0, void 0, function () {
219
- // 存储所有请求的结果
220
- // 定义一个递归函数,用于处理请求并控制并发数量
221
250
  function processRequest() {
222
251
  return __awaiter(this, void 0, void 0, function () {
223
- var res, result;
252
+ var resFn, result, progress, error_1;
224
253
  return __generator(this, function (_a) {
225
254
  switch (_a.label) {
226
255
  case 0:
227
- if (!functionArray.length) return [2 /*return*/];
228
- res = functionArray.shift();
229
- if (!res) return [2 /*return*/];
230
- return [4 /*yield*/, res()];
256
+ if (!(functionArray.length > 0)) return [3 /*break*/, 6];
257
+ resFn = functionArray.shift();
258
+ if (!resFn) return [3 /*break*/, 0];
259
+ _a.label = 1;
231
260
  case 1:
232
- result = _a.sent();
233
- // 执行请求并等待其完成
234
- results.push(result);
235
- // 将结果存储
236
- // 递归调用,确保有新的请求补充进去
237
- return [4 /*yield*/, processRequest()];
261
+ _a.trys.push([1, 4,, 5]);
262
+ return [4 /*yield*/, resFn()];
238
263
  case 2:
239
- // 将结果存储
240
- // 递归调用,确保有新的请求补充进去
264
+ result = _a.sent();
265
+ results.push(result); // 顺序由完成顺序决定
266
+ // 更新进度(使用互斥锁确保原子性)
267
+ return [4 /*yield*/, progressLock.acquire()];
268
+ case 3:
269
+ // 更新进度(使用互斥锁确保原子性)
241
270
  _a.sent();
242
271
  loaded += 1;
272
+ progress = loaded / resLength;
243
273
  onUploadProgress === null || onUploadProgress === void 0 ? void 0 : onUploadProgress({
244
274
  total: resLength,
245
275
  loaded: loaded,
246
- progress: loaded / resLength,
276
+ progress: progress,
247
277
  nowResponse: result,
248
- endResponses: results
278
+ endResponses: __spreadArray([], __read(results), false)
249
279
  });
280
+ progressLock.release();
281
+ return [3 /*break*/, 5];
282
+ case 4:
283
+ error_1 = _a.sent();
284
+ // 错误处理(根据需求决定是否抛出或记录)
285
+ console.error('请求失败:', error_1);
286
+ throw error_1;
287
+ case 5:
288
+ return [3 /*break*/, 0];
289
+ case 6:
250
290
  return [2 /*return*/];
251
291
  }
252
292
  });
253
293
  });
254
294
  }
255
- var _a, _b, limit, onUploadProgress, requestArray, functionArray, resLength, results, loaded, concurrent;
295
+ var _a, _b, limit, onUploadProgress, requestArray, functionArray, resLength, results, loaded, progressLock, concurrent;
256
296
  return __generator(this, function (_c) {
257
297
  switch (_c.label) {
258
298
  case 0:
@@ -266,23 +306,48 @@ var RequestUtil;
266
306
  resLength = functionArray.length;
267
307
  results = [];
268
308
  loaded = 0;
309
+ progressLock = new AsyncLock();
269
310
  concurrent = Array.from({
270
311
  length: Math.min(limit, resLength)
271
312
  }, function () {
272
313
  return processRequest();
273
314
  });
274
- // 等待所有并发的请求完成
275
315
  return [4 /*yield*/, Promise.all(concurrent)];
276
316
  case 1:
277
- // 等待所有并发的请求完成
278
317
  _c.sent();
279
318
  return [2 /*return*/, results];
280
- // 返回所有请求的结果
281
319
  }
282
320
  });
283
321
  });
284
322
  }
285
323
  RequestUtil.handleRequests = handleRequests;
324
+ // 互斥锁实现(简化版)
325
+ var AsyncLock = /** @class */function () {
326
+ function AsyncLock() {
327
+ this._locked = false;
328
+ this._queue = [];
329
+ }
330
+ AsyncLock.prototype.acquire = function () {
331
+ var _this = this;
332
+ return new Promise(function (resolve) {
333
+ var _tryAcquire = function tryAcquire() {
334
+ if (!_this._locked) {
335
+ _this._locked = true;
336
+ resolve();
337
+ } else {
338
+ _this._queue.push(_tryAcquire);
339
+ }
340
+ };
341
+ _tryAcquire();
342
+ });
343
+ };
344
+ AsyncLock.prototype.release = function () {
345
+ this._locked = false;
346
+ var next = this._queue.shift();
347
+ if (next) next();
348
+ };
349
+ return AsyncLock;
350
+ }();
286
351
  /**
287
352
  * 封装多个 Promise 方法,返回 [错误, 数据, 停止状态] 格式
288
353
  * @param {Array<Function | Promise> | Function | Promise} input - 返回 Promise 的函数数组或 Promise 数组,或者单个函数或 Promise
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "tools-min-ns",
3
3
  "description": "工具包适用于前端以及node",
4
- "version": "1.18.7",
4
+ "version": "1.18.8",
5
5
  "main": "lib/index.js",
6
6
  "license": "MIT",
7
7
  "author": "nanshen",