我创建了一个简单的Chrome扩展,它遍历用户浏览历史记录并计算匹配特定编程语言数组的结果数量。问题是我想迭代数组的长度,并为数组列表中的每个字符串调用一个异步chrome方法。该扩展可以在这里找到: What type of programmer are you? 有问题的代码是:for循环中的异步方法
function myfunction() {
var listOfLanguages = ["Java", "C", "C++", "PHP", "C#", "Visual Basic", "Python", "Objective-C", "Perl", "Javascript", "Ruby"];
var mostPopular = "not a programmer";
var totalResults = 0;
for (var i = 0, len = listOfLanguages.length; i < len; i++) {
(function (i) {
setTimeout(function() {
chrome.history.search({
text: listOfLanguages[i],
maxResults: 500
}, function (callback) {
var countOfResults = callback.length;
var langOfResults = listOfLanguages[i];
if (countOfResults > totalResults) {
totalResults = countOfResults;
mostPopular = langOfResults;
}
if (i == 10) {
var lang = mostPopular;
console.log(mostPopular);
switch (lang) {
case "Java":
document.write('<img src="assets/images/java.png"/>');
break;
case "C#":
document.write('<img src="assets/images/C#.jpg"/>');
break;
case "C":
document.write('<img src="assets/images/C.png"/>');
break;
case "C++":
document.write('<img src="assets/images/c++.png"/>');
break;
case "Objective-C":
document.write('<img src="assets/images/objectivec.png"/>');
break;
case "Perl":
document.write('<img src="assets/images/perl.gif"/>');
break;
case "PHP":
document.write('<img src="assets/images/php.png"/>');
break;
case "Python":
document.write('<img src="assets/images/python.jpg"/>');
break;
case "Ruby":
document.write('<img src="assets/images/ruby.png"/>');
break;
case "Visual Basic":
document.write('<img src="assets/images/vb.png"/>');
default:
document.write('<img src="assets/images/noprog.png"/>');
}
}
});
}, i * 1000);
})(i);
}
}
window.onload = myfunction;
我最终通过设置每次迭代里面超时功能周围找到一个工作,但它不是一个完美的解决方案。我已经在网上阅读了很多文章来处理这个问题,它们涉及到我不了解的更多层次的迭代。希望有人能够解释处理这个问题的正确方法,很多人都遇到过这个问题。