2011-05-03 19 views
6

Wykonuję kilka wywołań ajax jQuery w pętli. Za każdym razem, gdy jeden z wywołań ajax zwraca, muszę odwołać się do wartości odpowiadającej oryginalnemu wywołaniu ajax. Mój obecny kod nie działa poprawnie, ponieważ wartość zmiennej lskey została zmieniona przez kolejne iteracje pętli.jQuery Połączenie Ajax w pętli utraty lokalnej zmiennej referencyjnej

Oto kod:

for (var i = 0, len = localStorage.length; i < len; i++) { 
     var lskey = localStorage.key(i); 
     if (lskey.substr(0, 4) === 'form') { 
      var postdata = localStorage.getItem(lskey); // Get the form data 
      $.ajax({ 
       type: "POST", 
       async: "false", 
       url: "/Profile/PostForm", 
       data: postdata, 
       success: function (data) { 
        $('#rollinginfo').append('<br>' + data + ',key=' + lskey); 
        localStorage.removeItem(lskey); // Remove the relevant localStorage entry 
       } 
      , error: function (data) { $('#rollinginfo').append('<br />ERR:' + data); } 
      }); 


     } 
    } 

Problemem jest to, że lskey jest zmieniany za każdym razem, gdy pętla wykonuje, a zatem zwrotna sukces nie mają odniesienia do wartości lskey, które istniały w chwili połączenia.

Jak mogę podać prawidłową wartość lskey dla każdego oddzwonienia sukcesu?

Odpowiedz

6
for (var i = 0, len = localStorage.length; i < len; i++) { 
    var lskey = localStorage.key(i); 
    if (lskey.substr(0, 4) === 'form') { 
     var postdata = localStorage.getItem(lskey); // Get the form data 
     $.ajax({ 
      type: "POST", 
      async: "false", 
      url: "/Profile/PostForm", 
      data: postdata, 
      local_lskey: lskey 
      success: function (data) { 
       $('#rollinginfo').append('<br>' + data + ',key=' + lskey); 
       localStorage.removeItem(this.local_lskey); // Remove the relevant localStorage entry 
      } 
     , error: function (data) { $('#rollinginfo').append('<br />ERR:' + data); } 
     }); 
    } 
} 

To powinno zadziałać.

+0

Bardzo przydatne, bardzo dziękuję ... –

+0

Napisałem podejrzane dziwne zapytanie w Google i BAM! Pierwszym wynikiem jest twoja odpowiedź, wielkie dzięki! I TAK rządzi! – NaturalBornCamper

+0

Wyjaśnienie, dlaczego to działa, pomogłoby. – dshgna

0

Czy zastanawiałeś się nad łańcuchem połączeń AJAX? Zasadniczo można wykonać jedno wywołanie AJAX, przetworzyć wynik, zmodyfikować lskey itd. Następnie, gdy jesteś gotowy, zwiększ i i wydaj drugie wywołanie AJAX. Pętla w ten sposób zamiast używać pętli for ...

+0

dzięki. Sądzę, że mógłbym to zrobić w ten sposób, ale zastanawiałem się, czy istnieje jakiś sposób, aby "przekazać" wartość funkcji sukcesu. – Journeyman

1

Na koniec dodałem informacje o kluczach do serwera, a następnie zwróciłem je z serwera w formacie JSON, aby funkcja sukcesu mogła po prostu odnosić się do klucza zawarte w odpowiedzi serwera.

0

Można umieścić wywołanie ajax do własnej funkcji i przekazać wartości lskey i postData w. W ten sposób localStorage.removeItem(lskey) będzie odnosić się do zmiennej lskey w kontekście funkcji zamiast kontekście pętli.

Przykład

stwierdzenie funkcję -

function postForm(postdata, lskey) { 
    $.ajax({ 
    type: "POST", 
    async: "false", 
    url: "/Profile/PostForm", 
    data: postdata, 
    success: function(data) { 
     $('#rollinginfo').append('<br>' + data + ',key=' + lskey); 
     localStorage.removeItem(lskey); // Remove the relevant localStorage entry 
    }, 
    error: function(data) { 
     $('#rollinginfo').append('<br />ERR:' + data); 
    } 
    }); 
} 

Następnie można wywołać swoją funkcję z pętli -

for (var i = 0, len = localStorage.length; i < len; i++) { 
    var lskey = localStorage.key(i); 
    if (lskey.substr(0, 4) === 'form') { 
    var postdata = localStorage.getItem(lskey); // Get the form data 
    postForm(postdata, lskey); 
    } 
} 

Można również zadeklarować funkcję tuż przed pętlą (przypisanie jej do zmiennej), a następnie wywołanie go w pętli.

var postForm = function(postdata, lskey) { 
    $.ajax({ 
    type: "POST", 
    async: "false", 
    url: "/Profile/PostForm", 
    data: postdata, 
    success: function(data) { 
     $('#rollinginfo').append('<br>' + data + ',key=' + lskey); 
     localStorage.removeItem(lskey); // Remove the relevant localStorage entry 
    }, 
    error: function(data) { 
     $('#rollinginfo').append('<br />ERR:' + data); 
    } 
    }); 
} 
for (var i = 0, len = localStorage.length; i < len; i++) { 
    var lskey = localStorage.key(i); 
    if (lskey.substr(0, 4) === 'form') { 
    var postdata = localStorage.getItem(lskey); // Get the form data 
    postForm(postdata, lskey); 
    } 
} 
+0

Przykład, proszę? –

+0

@MattPowell Rzetelna prośba - przykłady zostały dodane. –

+0

Dziękuję bardzo! –

Powiązane problemy