2013-10-01 23 views
11

Mam pytanie dotyczące połączenia AJAX w przedziale. I dlaczego nie działa lub działa tak, jak działa.jQuery AJAX z interwałem

mam ten kod (ten nie działa)

setInterval($.ajax({ 
    //Place code here 
}), 2000); 

ale robię to w ten sposób

setInterval(function() { 
    $.ajax({ 
    //Do ajax stuff here 
    }); 
}, 2000); 

Teraz działa, ale dla mnie to wygląda jak ja tylko zrobić dodatkowa anonimowa funkcja.

+2

Należy podać funkcję do wykonania w każdym przedziale. '$ .ajax' nie zwraca funkcji, więc nie działa. –

+0

Świetne pytanie @Rob! Mam nadzieję, że moje edycje pomogą ci zrozumieć prawidłowe użycie przeceny :) Istnieje [meta post] (http://meta.stackexchange.com/questions/3122/formatting-sandbox), który jest dedykowanym piaskownicą do grania z postem format - być może pomoże ci to przyzwyczaić się do obniżki. – Lix

+2

@ Dziękuję za edycję :) –

Odpowiedz

11

setInterval wymaga funkcji lub kodu wykonywalnego w postaci ciągu znaków.

Pierwsze połączenie zadziała po umieszczeniu w ciągu znaków.

setInterval('$.ajax({ //Place code here })', 2000); 

Stosowanie tej składni jest odradzane z tych samych powodów, co użycie eval.

setInterval może również przyjąć opcjonalną listę parametrów. Można skorzystać z tego faktu i użyć czegoś takiego:

setInterval($.ajax/*a reference to the ajax function*/, 
2000, {url: 'someurl', success: onSuccess, error: onError}/*args passed to $.ajax*/ 
); 

Należy pamiętać, że to nie będzie działać dla metod obiektowych, które używają this określić kontekst, jako wartość this będzie zobowiązany do window. Oznacza to, że dodaje się nie uda:

setTimeout($('h1').css, 1000, {'color': 'red'}); 
+1

Czy możesz zmienić przykład kodu, aby nie używał 'eval'? Jestem w porządku z zachowaniem wyłączenia odpowiedzialności. – Halcyon

+0

@FritsvanCampen, ale bracie, to jedyny przykładowy kod w moim poście. –

+0

Dziękuję za odpowiedź :) –

3

setInterval wymaga funkcję jako pierwszy argument (Reference) i dlatego setInterval($.ajax({ //Place code here }), 2000); nie działa, ponieważ $.ajax funkcja zwraca jQuery XMLHttpRequest object(Reference)

setInterval(function() { $.ajax({ //Do ajax stuff here }); }, 2000); tworzy rzeczywiście anonimową funkcję ale jest to konieczne, chyba że podasz swój kod, aby był to string.

+0

Dzięki za odpowiedź :) –