【问题标题】:jQuery.Deferred in recursive cyclejQuery.Deferred 递归循环
【发布时间】:2015-01-26 12:26:06
【问题描述】:

我的代码中存在异步函数的复杂问题。 我有一个对象,我必须对其应用不同的功能(动画、内容分析等)。

this.buildChain = function (data, func, func_at, func_after) {

            //first I launch some function              
            func.apply(animData, arguments);

            //then I filter an array of objects             
            data.filter(function(e){
                if(e.trigger == 'at' && e.link == animData.id) return true; 
            }).forEach(function(e){

                //And apply the function to all objects that've been filtered
                //These  functions apply at the same time as the first, "func"                  
                func_at.apply(e, arguments);
            });

            //When my "func" and all "func_at" operations are resolved, I have
            //to filter my array again and execute "func_after" function
            data.filter(function(e){
                if(e.trigger == 'auto' && e.link == animData.id)  return true;
            }).forEach(function(e){
                func_after.apply(e, arguments);
            });

        };

问题是,我必须将此 buildChain 函数应用于递归函数:

function playChain(animData){

            function func() {
                //some action
            }

            function func_at () {
                playChain(this);
            }

            function func_after () {
                playChain(this);
            }

            s.buildChain(data, animData, func, func_at, func_after);
        }

我知道,它可以通过jQuery.Deffered() 对象以某种方式解决,但是在递归循环方面我被卡住了。因为实际的链可以从一个对象开始,所以会有几个func_at,然后是一个func_after,然后又是一个func_at。

【问题讨论】:

  • (1) 哪些函数是异步的? (2) 你真的是指arguments(在三个地方)还是那个伪代码?
  • 不,这不是伪代码。 data 是一个 Object 和 func、func_at 和 func_after - 一些作为参数传递的随机函数。 “func”和“func_at”同时启动,“func_after”应该在所有其他都完成后启动。
  • 所以“func”和“func_at”是异步的——它们返回promise?

标签: javascript jquery asynchronous recursion jquery-deferred


【解决方案1】:

我已将 return resolve $.Deferred() Object 添加到我的函数中。

function playChain(animData){

            function func() {
                //some action
                return new $.Deferred().resolve();
            }

            function func_at () {
                playChain(this);
            }

            function func_after () {
                playChain(this);
            }

            s.buildChain(data, animData, func, func_at, func_after);
        }

然后我已经更正了 buildChain 函数。

this.buildChain = function (data, animData, func, func_at, func_after) {

            function act1 () {

                var d = func.apply(animData, arguments);

                data.filter(function(e){
                    if(e.trigger == 'at' && e.link == animData.id) return true;
                }).forEach(function(e){
                    func_at.apply(e, arguments);
                });
                return d;
            }

            function act2() {
                data.filter(function(e){
                    if(e.trigger == 'auto' && e.link == animData.id)  return true;
                }).forEach(function(e){
                    func_after.apply(e, arguments);
                });
            }

            act1().done(act2);
        };

【讨论】:

  • 但这似乎没有等待func_at 和func_after 异步调用?
  • 问题是,func_at 与 func 同时调用。而func_after在act2中,只有在act1解决后才会调用,所以如果你把return new $.Deferred().resolve();放在setTimeout()中,它会等待。
猜你喜欢
  • 2018-06-27
  • 2017-01-21
  • 1970-01-01
  • 2013-08-12
  • 2011-02-09
  • 2023-04-02
  • 2011-08-11
  • 1970-01-01
相关资源
最近更新 更多