【问题标题】:Jquery Promise with Recursive Ajax带有递归 Ajax 的 Jquery Promise
【发布时间】:2015-07-17 10:43:28
【问题描述】:

我在这里阅读了其他答案,但不能完全符合我的问题。对于在 Promises 方面有丰富经验的人来说应该很简单。下面的代码,我需要帮助修复递归函数,因为在该 ajax 调用中发生的所有事情在第一次完成时都不可用。下面的代码将解释(注意 TypeScript 语法):

//Main
private Start(){
    this.PopulateSomething().done(() => {
        alert('done');
    });
}

private PopulateSomething(): JQueryPromise<any> {
    var dfd: JQueryDeferred<any> = jQuery.Deferred<any>();

        //app.ExecuteAjax is just a wrapper for a ajax call.. note i'm using callbacks
        app.ExecuteAjax("SomeParamater1", function (returnedObject) {
            //Do something with returnedObject                    
            $.each(returnedObject.something, function () {
                app.RecursivelyDoSomething(this);                                                        
            });                              
            dfd.resolve();
        });
    return dfd.promise();
}

private RecursivelyDoSomething(Thing: any) {     
    //Do something with Thing           

    //Anything that happens within this Ajax call is not available when alert('done'); is executed
    app.ExecuteAjax("SomeParamater1", function (returnedObject) {
        $.each(returnedObject.something, function () {
            app.RecursivelyDoSomething(this);                                                        
        });
    });
}

【问题讨论】:

  • 你需要让RecursivelyDoSomething返回一个承诺。而不是$.each 使用$.map 以便您获得一系列承诺,然后您可以使用wait for。哦,不要使用deferred antipattern
  • @Bergi 我喜欢这个想法和方法。尽管如此,仍然难以想象它。我理解在 RecursivelyDoSomething 函数上返回一个承诺,但我什么时候真正调用解析?抱歉,我只知道关于 Promise 的两件事:Promise 和 resolve :-)
  • 当函数所做的所有事情都完成后,从函数返回的承诺将通过该函数的最终结果来解决。所以当 ajax 调用和所有递归调用完成时它会解决。
  • Q1:您是否使用每个 Ajax 调用的结果来填充树或其他东西以提供更多节点? Q2:您希望这些操作按顺序运行、并行运行(受浏览器限制)还是两者的某种组合? Q3:数据是固定深度的,还是真的需要递归?
  • 嘿@TrueBlueAussie。感谢您对 helpgin 解决此问题的兴趣。 Q1:是的,我正在填充一棵树(使用淘汰赛递归模板)。 Q2。我可以同步但不希望浏览器锁定。 Q3。不幸的是,它不是固定的深度数据,所以必须是真正的递归......

标签: javascript jquery recursion typescript jquery-deferred


【解决方案1】:

似乎您想recursively 进行ajax 查询,并且只想在最后一个之后执行done。一种方法是保留未决 ajax 查询的计数,根据Thing 增加此计数,并根据Ajax 完成减少此计数。然后只解析 dfd 一次 count = 0。

【讨论】:

  • 不,请不要。当你手头有它们时使用它们!无需手动计数。
猜你喜欢
  • 2021-02-03
  • 1970-01-01
  • 2015-10-28
  • 2017-03-25
  • 2019-04-28
  • 2011-09-13
  • 2021-04-29
  • 2016-03-02
  • 1970-01-01
相关资源
最近更新 更多