promise事件队列咋封装?

发布于 2022-09-11 14:32:29 字数 2540 浏览 15 评论 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;
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文