xunfeiAI/node_modules/miniprogram-queue/dist/index.js

179 lines
5.9 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"use strict";
/// <reference lib="es6"/>
Object.defineProperty(exports, "__esModule", { value: true });
/**
* 微信小程序操作队列封装管理
* @example var rq = new WxQueue(wx.requst);
* @template TParam 微信操作参数类型
* @template TTask 微信操返回task类型
*/
var WxQueue = /** @class */ (function () {
/**
* 创建Wx操作队列
* @param wxFunc Wx操作函数
* @param maxLength 最大队列长度默认10
*/
function WxQueue(wxFunc, maxLength) {
if (maxLength === void 0) { maxLength = 10; }
/**
* 任务ID计数器
*/
this.taskid = 0;
/**
* 待完成队列
*/
this.todo = [];
/**
* 保持正在运行的任务
*/
this.taskMap = new Map();
this.operator = wxFunc;
this.MAX = maxLength || 10;
}
/**
* 向队列中添加操作
* @param param 微信操作
*/
WxQueue.prototype.push = function (param) {
var _this = this;
var id = ++this.taskid;
if (this.taskMap.size < this.MAX) {
// task队列未满
return this._process(id, param);
}
else if (param.jump) {
// 插队
this.todo.unshift([id, param]);
}
else {
this.todo.push([id, param]);
}
return {
abort: function () { _this._abort(id); },
onProgressUpdate: function (callback) { _this._onProgress(id, callback); },
onHeadersReceived: function (callback) { _this._onHeaders(id, callback); }
};
};
/**
* check and do next task
*/
WxQueue.prototype._next = function () {
if (this.todo.length > 0 && this.taskMap.size < this.MAX) {
var _a = this.todo.shift(), taskid = _a[0], taskOptions = _a[1];
this._process(taskid, taskOptions);
}
};
/**
* process a task
* @param id task ID
* @param options task param
*/
WxQueue.prototype._process = function (id, options) {
var _this = this;
var oldComplete = options.complete;
var timeoutFailHandle;
var taskTimeoutCancelled = false;
var task;
options.complete = function (res) {
if (timeoutFailHandle) {
// 清理计时器
clearTimeout(timeoutFailHandle);
}
if (options.timestamp && _this.taskMap.has(id)) {
res.time = _this.taskMap.get(id)[1] || {};
res.time.response = Date.now();
}
_this.taskMap.delete(id);
// 原始结束回调
if (oldComplete) {
if (taskTimeoutCancelled) {
res.errMsg = (res.errMsg || '').split(':', 1)[0] + ": timeout";
res.timeout = true;
}
oldComplete.call(options, res);
}
_this._next();
};
if (options.timeout > 0) {
// 自定义timeout 拦截fail 注入timeout
var oldFail_1 = options.fail;
if (oldFail_1) {
options.fail = function (res) {
if (taskTimeoutCancelled) {
res.errMsg = (res.errMsg || '').split(':', 1)[0] + ": timeout";
res.timeout = true;
}
if (oldFail_1) {
oldFail_1.call(options, res);
}
};
}
// 计时器 自定义超时
timeoutFailHandle = setTimeout(function () {
timeoutFailHandle = undefined;
taskTimeoutCancelled = true;
task.abort();
}, options.timeout);
}
task = this.operator(options);
// task progress polyfill
if (options.onProgressUpdate && task.onProgressUpdate) {
task.onProgressUpdate(options.onProgressUpdate);
}
// task onHeadersReceived
if (options.onHeadersReceived) {
task.onHeadersReceived(options.onHeadersReceived);
}
this.taskMap.set(id, [
task,
options.timestamp ? { send: Date.now() } : undefined
]);
return task;
};
/**
* stop and remove a task
* @param taskid - the id of task to abort
*/
WxQueue.prototype._abort = function (taskid) {
var index = this.todo.findIndex(function (v) { return v[0] === taskid; });
if (index >= 0) {
var completeCallback = this.todo[index][1].complete;
this.todo.splice(index, 1);
// call back complete.
if (completeCallback) {
completeCallback({ errMsg: 'request:fail abort', cancel: true, source: WxQueue.name });
}
}
else if (this.taskMap.has(taskid)) {
this.taskMap.get(taskid)[0].abort();
this.taskMap.delete(taskid);
}
};
/**
* progress update callback
* https://developers.weixin.qq.com/miniprogram/dev/api/network/download/DownloadTask.onProgressUpdate.html
* @param taskid - task id
* @param callback 回调操作
*/
WxQueue.prototype._onProgress = function (taskid, callback) {
var result = this.todo.find(function (v) { return v[0] === taskid; });
if (result) {
result[1].onProgressUpdate = callback;
}
else if (this.taskMap.has(taskid)) {
this.taskMap.get(taskid)[0].onProgressUpdate(callback);
}
};
WxQueue.prototype._onHeaders = function (taskid, callback) {
var result = this.todo.find(function (v) { return v[0] === taskid; });
if (result) {
result[1].onHeadersReceived = callback;
}
else if (this.taskMap.has(taskid)) {
this.taskMap.get(taskid)[0].onHeadersReceived(callback);
}
};
return WxQueue;
}());
exports.WxQueue = WxQueue;
//# sourceMappingURL=index.js.map