2014-08-29 25 views
1

嗨我正在做一个JavaScript脚本,现在越来越难编辑,并很难理解其他人,我会把它放在这里希望有人能够理解它并给一些建议或者帮助需要循环取决于一个条件javascript

function fetchMember(id, select, sitename, total) { 
    return function() { 
     progress(); 
     $.ajax({ 
      type: 'POST', 
      url: "script.php", 
      data: $("#fetch").serialize() + "&id=" + id, 
      success: function(data) { 
       isUser = ($(data).text().indexOf("Invalid User") == -1); 
       if (isUser) { 
        username = $(data).find(".normal").text(); 
        saved = id - invalid; 
        $.ajax({ 
         type: 'POST', 
         url: "save.php", 
         data: {'username': username}, 
         success: function(data) { 
          $("#test").append(id+" "+data + "<br />"); 
          select.text(sitename+"("+saved+"/"+total+")"); //Updating numbers of fetched profiles on the frontend 
         } 
        }); 
       } 
       else 
       invalid++; //loop again here because a user wan't valid 
       progress(); 
      } 
     }); 
    } 
} 
for (i = 0; i < members; i++) { 
      fetched++; 
      setTimeout(fetchMember(fetched, select, sitename, total), wait*i); 
     } 

基本上是我需要做的是循环再如果在操作结束时也有一些非法用户,任何帮助非常感谢

+0

小建议 - 您可以将所有这些匿名函数分隔为命名函数。另外,“done-fail-always”回调看起来更漂亮,更短,请参阅jQuery AJAX官方文档。它会使你的代码嵌套更少,更易于理解。 – 2014-08-29 13:53:07

+0

什么是'progress()'?那个'setTimeout'有什么好处? '无效++'如何触发另一个循环?或者是你有什么问题 - 如果是的话,应该重复什么功能? – Bergi 2014-08-29 13:54:27

+0

@Bergi progress()只是一个动画进度条的功能,如果你愿意,我可以把它放在这里,seTimeout需要在ajax连接之间放置一个800ms的间隔(要有响应)或者甚至超过800ms如果由用户设置。无效的++是跟踪脚本找到了多少无效用户,我想我需要重复fetchmember函数,具体取决于有多少用户无效。我希望我已经清楚了,谢谢你的帮助 – 2014-08-29 14:01:57

回答

0

我不知道如果这个代码将有助于你,虽然它不是完全适合你的情况,并没有经过测试。主要原理是memberFetch函数的递归调用。在这种情况下不需要超时 - 它将不会向服务器发出任何新请求,直到获得最后一个响应。随意提出任何问题,但请尝试自己试验:)

var currentId = 0; // Current member id 
var membersNum = 10; // There are 10 members from 0 to 9 
var neededValidUsersNum = 5; // We need only 5 valid users... 
var valudUsersNum = 0; // ... but now we have 0 of them 

// Let's make an array of all possible id's 
// It will be a queue - we will try to fetch the first id 
// In case of success - save data, remove that id from the queue, fetch the nex one 
// Otherwise - put it at the back of the queue to try it again later 
var possibleIds = []; 
for (var i = 0; i < membersNum; i++) { 
    possibleIds.push(i); 
} 

// Fetched user data storage 
var userData = {}; 

function fetchMember(id) { 
    var data = "some data"; 

    $.post('script.php', data) 
     .done(function(responseData){ 
      onFetchMemberDone(id, responseData); 
     }) 
     .fail(function(){ 
      onFetchMemberFail(id); 
     }); 
} 

function onFetchMemberDone(id, responseData){ 
    // Save recieved user data 
    userData[id] = responseData; 
    // Bump valid users num 
    valudUsersNum++; 
    // If there are not enough valid users - lets continue: 
    if (valudUsersNum < neededValidUsersNum) { 
     // Remove valide user from the queue (it was the first one) 
     possibleIds.shift(); 
     // try to fetch the next one 
     var nextPossibleId = possibleIds[0]; 
     fetchMember(nextPossibleId); 
    } 
} 

function onFetchMemberFail(id){ 
    // add failed user to the end of the queue 
    possibleIds.push(id); 
    // try to fetch the next one 
    var nextPossibleId = possibleIds[0]; 
    fetchMember(nextPossibleId); 
} 

// Lets launch the cycle! It doesn't look like one because it works through recursive calls 
onFetchMember(0); 
+0

这太棒了!非常感谢您的大力帮助,我将在一天内使用这个功能,并让您知道它是如何发展的,我不喜欢在完成一个Ajax连接之前不会启动ajax连接,因为这会使脚本较慢,但我认为我必须要这样做。谢谢:) – 2014-08-29 14:51:45

+0

不客气!一个有趣的问题,顺便说一句。 – 2014-08-29 14:52:55

+0

此外,我将失去用户设置的每个连接之间的时间间隔。但是如果这是唯一的方法,我想我必须得到这个 – 2014-08-29 14:56:44