Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Переход на url после окончания цикла (https://javascript.ru/forum/events/43784-perekhod-na-url-posle-okonchaniya-cikla.html)

vas88811 20.12.2013 14:33

Переход на url после окончания цикла
 
Подскажите пожалуйста. Имеется следующая проблема.

Есть цикл с получением данных от контакта и отправкой их в базу. Нужно, чтобы четко при окончании цикла и занесении всех данныx в базу срабатывал код перехода на другую страницу. Такой код этого не делает:

function perehod() {

VK.api("wall.get", {filter:"others"}, function(dataFr) {
var num = dataFr.response[0];

var chis = num/100;
for (var c=0; c<chis; c++) {
var cif = 100*c;

VK.api("wall.get", {count:"100",offset:cif,filter:"others"}, function(data) {
var profilesCount1 = data.response.length;

// проверяем был ли ответ
if(data.response) {
// отправляем полученные данные пост запросом через ajax jquery:

for (var i=0; i<profilesCount1; i++) {
$.post("vbazy1.php", { id: data.response[i].to_id, to_id: data.response[i].date, from_id: data.response[i].from_id, text: data.response[i].text}, function(data) { } );
}
}
});
}
});

document.location.href = "http://www.site.ru";

}



При срабатывании функции сразу происходит переход, но данные в базу не заносятся(или не успевают занестись). Как сделать, чтобы сначала данные занеслись, цикл сработал, а потом произошел переход?

Спасибо.

cyber 20.12.2013 14:45

Цитата:

Сообщение от vas88811
function(data) { }

как думаете callback функция придумана для красоты?
function(data) { }

пока эта функция не вызовется данные не могут быть занесены, как только вызовутся все callback тогда можно делать переход.

ANDRUkomod 20.12.2013 15:37

ajax запросы через фреймворк jquey по умолчанию происходят асинхронно. и если написать что-то типо такого:
alert(1);
jQuery.post(....,function(responce){ alert(2);});
alert(3);

то в результате вы получите alert(1), alert(3), alert(2).
Учитывайте это. Впишите "document.location.href = "http://www.site.ru";" во внутрь метода callback вашего ajax.
Либо используйте Синхронные запросы, но это приостанавливает работу браузера и теряется весь смысл в технологии ajax.

ksa 20.12.2013 15:44

Цитата:

Сообщение от vas88811
Нужно, чтобы четко при окончании цикла и занесении всех данныx в базу срабатывал код перехода на другую страницу

Как вариант...
Делать тот переход в калбек-функции последней итерации цикла.

danik.js 20.12.2013 15:49

Цитата:

Сообщение от ksa
Делать тот переход в калбек-функции последней итерации цикла.

А кто даст гарантию что последний запрос завершится в последнюю очередь?

Есть такая штука как $.when, никогда не пользовался, думаю она тут в самый раз:

var deferreds = [];
for (var i=0; i<profilesCount1; i++) {
    deferreds[i] = $.post("vbazy1.php", {
        id: data.response[i].to_id,
        to_id: data.response[i].date,
        from_id: data.response[i].from_id,
        text: data.response[i].text
    });
}

$.when.apply($, deferreds).done(function() {
    location.href = "http://www.site.ru";
});


http://api.jquery.com/jQuery.when/

ANDRUkomod 20.12.2013 15:58

код на скорую руку могут быть ошибки

Замените эту часть
for (var i=0; i<profilesCount1; i++) {
$.post("vbazy1.php", { id: data.response[i].to_id, to_id: data.response[i].date, from_id: data.response[i].from_id, text: data.response[i].text}, function(data) { 	} );
}


на что-то подобное

function run(data,next,profilesCount1)
{
$.post("vbazy1.php", { id: data.data.response[next].to_id, to_id: data.response[next].date, from_id: data.response[next].from_id, text: data.response[next].text}, function(data) { if( next+1 < profilesCount1 ) run(data,next++,profilesCount1); else document.location.href = "http://www.site.ru";	} );
}
run(data, 0, profilesCount1);

danik.js 20.12.2013 16:02

ANDRUkomod, стоило отметить, что в твоем варианте запросы идут последовательно, а не параллельно, так что это замедляет работу скрипта.

ANDRUkomod 20.12.2013 16:03

Согласен, но в условии этого не было, а выполнено будет как задумывал автор.

ksa 20.12.2013 16:29

Цитата:

Сообщение от danik.js
А кто даст гарантию что последний запрос завершится в последнюю очередь?

Никто. :D
В этом случае и цикл нужно не так организовывать... Либо полученые ответы считать...

danik.js 20.12.2013 16:42

Цитата:

Сообщение от ksa
Либо полученые ответы считать...

Мой вариант смотрел? Ждем пока автор проверит его..


Часовой пояс GMT +3, время: 15:41.