promise事件队列咋封装?
问题:
怎么实现把 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;
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
https://github.com/wxungang/a... 已经封装完成!