【问题标题】:Need suggestions on JavaScript recursion and async methods需要有关 JavaScript 递归和异步方法的建议
【发布时间】:2014-03-07 18:52:49
【问题描述】:

我有一个递归方法,其中包含一个异步方法:

var loadWebsRecursively = function (url) {

    loadWebsDeferred(url).then(function (webs) {

        var wE = webs.getEnumerator();
        webCount += webs.get_count();
        while (wE.moveNext()) {
            var site = wE.get_current();
            var title = site.get_title().toLowerCase();
            var fqdn = siteRootUrl + site.get_serverRelativeUrl() + '/';
            .... // additional work
        }

         webProcessed++;
         loadWebsRecursively(fqdn);
    }
};

我需要一些关于如何确定所有递归调用都已完成的建议。每个网站可以有“N”个子网站。

提前致谢!

【问题讨论】:

  • M Quickel - 您确定解决方案了吗?级联删除也有类似的情况,我事先不知道有多少孩子以及我正在处理的深度。
  • 认为我可以为 DB 树遍历操作重新设计这个概念 - grammerjack.blogspot.jp/2010/12/…

标签: javascript asynchronous recursion


【解决方案1】:

您似乎正在寻找解决承诺序列。如果您使用的是 javascript 的原生 ES6 Promise 实现,那么您可能正在寻找类似以下内容:

// Loop through our chapter urls
story.chapterUrls.reduce(function(sequence, chapterUrl) {
  // Add these actions to the end of the sequence
  return sequence.then(function() {
    return getJSON(chapterUrl);
  }).then(function(chapter) {
    addHtmlToPage(chapter.html);
  });
}, Promise.resolve());

更多详情请看这里:
http://www.html5rocks.com/en/tutorials/es6/promises/#toc-parallelism-sequencing

【讨论】:

  • 我正在使用 jQuery 延迟库。我认为解决方案的问题在于我有未知数量的承诺。例如,如果我知道我的层次结构中有 20 个项目,我可以预先构建我的所有承诺,然后使用 .when() 检查它们的完成情况。就我而言,在递归函数的回调再次发生之前,不会将新的 Promise 添加到我的 Promise 集合中,因此我一直在检查针对移动目标的分辨率。
  • 同意,如果你事先知道你要处理的顺序,问题就很简单了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-08
  • 1970-01-01
  • 2010-10-21
相关资源
最近更新 更多