- 17
- 0
问题:
怎么实现把 promise then 模式的事件暂时封装到一个队列中,然后遍历队列,去执行相应的事件!
实际场景:
ajax 层的请求依赖一些共用数据,但是不想在业务层去控制这个依赖的逻辑。想集中到 ajax封装层的事件队列中处理!业务层只需要 提供依赖参数的字段既可!
备注
传统的 callback 模式 队列实现
"use strict";
window.personal = window.personal || {};
personal.ajax = personal.ajax || {};
let ajaxQueue = [];
let promiseQueue = [];
let flag = false;
(function () {
let _this = this;
//传统的 callback 模式 队列实现很简单
this._ajax = function (params) {
if (!flag) {
ajaxQueue.push(params);
return;
}
$.ajax({
type: params.type || 'get',
url: params.url,
data: params.data || {},
success: function (data, status, xhr) {
params.callback(data, status, xhr);
},
error: function (xhr, errorType, error) {
params.callback(xhr, errorType, error);
}
})
}
this.axiosCallback = function (params) {
if (!flag) {
promiseQueue.push(params);
} else {
return axiosAjax(params, false)
}
}
}).call(personal.ajax);
function axiosAjax(params, isPromise = true) {
params.type = params.type || 'get';
// get/post 字段不一样!
const _data = params.type === 'get' ? {
params: params.data
} : {
data: params.data
};
const _config = Object.assign({
method: params.type,
url: params.url
}, _data);
return axios(_config).then((res = {}) => {
return isPromise ? res.data : void params.callback(res.data, 100, 'ok');
}).catch((err = {}) => {
return isPromise ? err : void params.callback(err, 0, 'err');
})
}
_timer(function () {
if (ajaxQueue.length) {
console.log('flag=>' + flag)
personal.ajax._ajax(ajaxQueue.shift());
personal.ajax.axiosCallback(promiseQueue.shift());
}
}, 100);
setTimeout(function () {
flag = true;
console.log('------flag-----')
}, 1500);
/**
*
* @param callback
* @param timeout
*/
function _timer(callback, timeout = 1000) {
let _flag = true;
(function _inner() {
//先执行
// callback();
let _timer = _flag && setInterval(() => {
_timer && clearInterval(_timer);
//or 后执行
callback();
_inner(callback, timeout);
}, timeout);
})();
return function close() {
_flag = false;
}
}
0
打赏
收藏
点击回答
网站公告
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部
