我有一个函数,该函数可循环访问不确定数量的项,并对每个项进行异步调用以获取其他数据(html模板文件的内容)。回调进行一些检查。结果函数应该是可以的。 $ q是较早注入的,此代码是工厂的一部分。

function searchHelpTopics(topics, searchPhrase) {
    if (topics == null || topics.length == 0) return "No search results";
    var results = [];
    var promises = [];
    for (var i = 0; i < topics.length; i++) {
        var templateURL = topics[i].URL;
        var topic = topics[i];
        if (topics[i].HelpTopicId != "Search") {
            var promise = $templateRequest(templateURL).then(function (template) {
                var text = HTMLToText(template, true);
                // do the search
                if (text.indexOf(searchPhrase) > -1) {
                    if (text.length > 50) text = text.substring(0, 50);
                    var result = {};
                    result.title = topic.Title;
                    result.excerpt = text;
                    result.helpID = topic.HelpTopicID;
                    results.push(result);
                }
            });
            promises.push(promise);
        }
    }
    return $q.all(promises).then(function () {
        return results;
    })


这里的问题是for循环显然不会等待回调,因此回调所使用的主题不是正确的主题。我需要一种将主题传递到每个循环的回调中的方法。

最佳答案

由于JS仅具有函数作用域,因此您可以重写代码以使用函数,而不要使用“ for”循环(通常更好)。

为此,您可以使用JS内置的forEach(可从1.6版开始使用,因此几乎适用于所有浏览器)或良好的功能样式库,例如underscore.js或lodash.js。

甚至更好-要使用Array.map和Array.filter-请参见代码



function processTemplate(topic, template) {
  var text = HTMLToText(template, true);
  // do the search
  if (text.indexOf(searchPhrase) < 0) {
    return;
  }
  if (text.length > 50) {
    text = text.substring(0, 50);
  }
  return {
    title: topic.Title,
    excerpt: text,
    helpID: topic.HelpTopicID
  };
}

function searchHelpTopics(topics, searchPhrase) {
  if (!topics || topics.length === 0) {
    return "No search results";
  }
  var promises = topics
    .filter(function(topic) { return topic.HelpTopicId !== "Search"; })
    .map(function(topic) {
      return $templateRequest(topic.URL).then(processTemplate);
    });
  return $q.all(promises)
    .then(function (results) {
      return results.filter(function (result) {
        return result; // filters out 'undefined'
      });
    });
}

关于javascript - AngularJS将变量传递到循环的异步回调中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41682109/

10-11 22:51
查看更多