2014-08-29 26 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