【发布时间】: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