Javascript:如何做功能或类似的链表?

时间:2011-08-22 07:46:48

标签: javascript jquery

我正在尝试创建一个动作数组。基本上这些是知道接下来要触发的函数的函数列表。我已经尝试了很多方法,但无法使它们可靠地工作。我正在做gui并且在他们完成工作时弹出框架回调(选择文件,编辑属性等)。

示例流程:

任务1:打开FileBrowser(iframe浏览控件),选中后,执行任务2 任务2:从FileBrowser获取值,打开iframe FileProperties。完成后执行任务3 任务3:获取FileProperties id,在页面控件中添加id

每个任务都必须等待上一个任务的回调。我对所有想法都持开放态度!唯一的一步是生成服务器端的步骤所以我需要避免硬编码!以下是我到目前为止的尝试!

感谢所有的想法。

FruitBat

/* action array */
            var actions = new Array();
            var data = {};
            var op = function(fn, next, data) {
                this.op = this;
                this.fn = fn;
                this.next = next;
                this.data = data;
            };


        function one(myop) {
            var op1 = myop;
            var url = 'poptarget.aspx?cid=21&data=' + escape('[Id]=[2],[cid]=[3]');
            var frame = $().popFrame('UniqueId', { caption: 'Page Item', url: url, width: 'auto', modal: true });
            frame.bindEvent("cancelled saved", function(e, d) {
                console.log('other');
                callback();
            });
            frame.bindEvent("close", function(e, d) {
                console.log('close');
                op1.next.fn.call(op1.next);
            });
        };
        function two(myop) {
            console.log('woohoo');
        };

        actions.push(new op(one, two, null));
        actions.push(new op(two, null, null));
        var start = actions[0];
        start.fn.call(start);

        console.log(data);`

2 个答案:

答案 0 :(得分:0)

我认为你错误地使用了.call()。请参阅MDN doco on call。据我了解:

start.fn.call(start);  // sets 'this' to start

将调用函数fn并将其this设置为引用start,默认情况下会发生这种情况,因为您使用fn中的点符号来调用start 1}}。在您的函数one()中,您根本没有使用this,而是使用了您似乎期望为start的声明参数。尝试将该行更改为:

start.fn(start);   // passes start as a parameter

同样在one()函数中,您引用的callback()似乎没有在任何地方定义。

答案 1 :(得分:0)

您是否查看过任何异步/流量控制库?例如,async提供了非常全面的将函数链接在一起的方法。