AlexZ33 / lessions

自己练习的各种demo和课程
12 stars 2 forks source link

promise全知道 #56

Open AlexZ33 opened 4 years ago

AlexZ33 commented 4 years ago

回调 -promsie互相转化

https://github.com/RyanZim/universalify/blob/master/index.js

AlexZ33 commented 4 years ago

用 Reduce 实现 Promise 串行执行

https://juejin.im/post/5bd65b98f265da0a91458ee6

AlexZ33 commented 3 years ago
/**
 * 类名 : scripts/utils/tiny-promise
 * 描述:  提供页面ajax请求和数据缓存
 * 创建人:
 * 创建日期:  2017/12/5
 *
 * 修改历史
 * 修改日期: <修改日期,>
 * 修改人:
 * 修改原因/修改内容: <修改原因描述> <问题单号: ${问题单号}>
 */

define('utils/tiny-promise', ['libs/moment-2.6.0'], () => {
    const promise = {

        /**
         * 这里提供下success和fail,可以扩展其它方法,
         * 约束:需要jquery已经引入,并作为全局变量
         * 作用:部分方法返回数据需要缓存,但angular只能写拦截器,
         *      调用此方法是保证已经有数据,并且直接传入即可
         * @returns {*}
         */
        createPromise() {
            const me = this;
            const dtd = $.Deferred();
            const promise = dtd.promise();

            $.extend(promise, {
                _successStack: [],
                _failStack: [],
                success(f) {
                    _.isFunction(f) && this._successStack.push(f);
                    return this;
                },
                /**
                 *
                 * fail和error都执行_failStack函数队列
                 * @param f
                 * @returns {promise}
                 *
                 */
                fail(f) {
                    _.isFunction(f) && this._failStack.push(f);
                    return this;
                },
                error(f) {
                    _.isFunction(f) && this._failStack.push(f);
                    return this;
                },
                /**
                 * 代理处理正确和错误执行
                 * @param res
                 * @param successFlag
                 */
                execute(res, successFlag) {
                    successFlag ? dtd.resolve(res) : dtd.reject(res);
                }
            });
            promise.then((res) => {
                $.each(promise._successStack, (i, v) => {
                    const cloneRes = $.extend(true, {}, res);
                    v(cloneRes);
                });
            });
            promise.fail((res) => {
                $.each(promise._failStack, (i, v) => {
                    v(res);
                });
            });
            return promise;
        }
    };

    return promise;
});