使用reduce组合无限的函数调用链

一个对象, 对象中有before与enter方法, 其中 before 可以执行异步任务, 完成后执行回调再进入enter. 

现在可能有若干个这样的对象,要求按顺序依次执行下来. 示例如下:


var a = {

    before: function(obj, next) {

        console.log("a before!");

        setTimeout(function() {

            next(obj);

        }, 1000);

        return false;

    },

    enter: function(obj) {

        console.log("a entered!");

    }

};

var b = {

    parent: a,

    before: function(obj, next) {

        console.log("b before!");

        setTimeout(function() {

            next(obj);

        }, 1000);

        return false;

    },

    enter: function(obj) {

        console.log("b entered!");

    }

};

var c = {

    parent: b,

    before: function(obj, next) {

        console.log("c before!");

        setTimeout(function() {

            next(obj);

        }, 1000);

        return false;

    },

    enter: function(obj) {

        console.log(" c entered!", obj);

    }

};


// 组装后的函数

var fnChain = function(obj) {

    a.before(obj, function(obj) {

        a.enter(obj);

        b.before(obj, function(obj) {

            b.enter(obj);

            c.before(obj, function(obj) {

                c.enter(obj);

            });

        });

    });

};


fnChain({ Status: 1, Data: { name: "Anonymous" } });

示例中的 fnChain 是我手写出来的, 现实中不能这样. 我想实现一个函数, 可以根据对象队列, 自动生成这个 fnChain


比如我已经有这么一个队列, 然后传给那个函数:


var arr = [d, c, b, a];

getFnChain(arr); // 得到一个 fnChain

怎么实现这个 getFnChain 呢? 我有一个初步想法是依靠 reduce, 但不幸的是我试了半天, 头都晕了, 也没想出来 ╮(╯Д╰)╭ . 看来对 reduce的理解还差得远.


希望有大神能帮助我. 可以参照示例代码中的 fnChain , 这就是我最终想获得的 函数


能顺带讲一下原理就更好了 (눈_눈)


富国沪深
浏览 349回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript