20.12.2013, 14:33
|
Интересующийся
|
|
Регистрация: 20.12.2013
Сообщений: 22
|
|
Переход на 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";
}
При срабатывании функции сразу происходит переход, но данные в базу не заносятся(или не успевают занестись). Как сделать, чтобы сначала данные занеслись, цикл сработал, а потом произошел переход?
Спасибо.
|
|
20.12.2013, 14:45
|
|
I am Student
|
|
Регистрация: 17.12.2011
Сообщений: 4,415
|
|
Сообщение от vas88811
|
function(data) { }
|
как думаете callback функция придумана для красоты?
function(data) { }
пока эта функция не вызовется данные не могут быть занесены, как только вызовутся все callback тогда можно делать переход.
__________________
Цитата:
|
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
|
|
|
20.12.2013, 15:37
|
Новичок на форуме
|
|
Регистрация: 08.09.2013
Сообщений: 9
|
|
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.
|
|
20.12.2013, 15:44
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,228
|
|
Сообщение от vas88811
|
Нужно, чтобы четко при окончании цикла и занесении всех данныx в базу срабатывал код перехода на другую страницу
|
Как вариант...
Делать тот переход в калбек-функции последней итерации цикла.
|
|
20.12.2013, 15:49
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Сообщение от 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/
__________________
В личку только с интересными предложениями
|
|
20.12.2013, 15:58
|
Новичок на форуме
|
|
Регистрация: 08.09.2013
Сообщений: 9
|
|
код на скорую руку могут быть ошибки
Замените эту часть
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);
|
|
20.12.2013, 16:02
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
ANDRUkomod, стоило отметить, что в твоем варианте запросы идут последовательно, а не параллельно, так что это замедляет работу скрипта.
__________________
В личку только с интересными предложениями
|
|
20.12.2013, 16:03
|
Новичок на форуме
|
|
Регистрация: 08.09.2013
Сообщений: 9
|
|
Согласен, но в условии этого не было, а выполнено будет как задумывал автор.
|
|
20.12.2013, 16:29
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,228
|
|
Сообщение от danik.js
|
А кто даст гарантию что последний запрос завершится в последнюю очередь?
|
Никто.
В этом случае и цикл нужно не так организовывать... Либо полученые ответы считать...
|
|
20.12.2013, 16:42
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Сообщение от ksa
|
Либо полученые ответы считать...
|
Мой вариант смотрел? Ждем пока автор проверит его..
__________________
В личку только с интересными предложениями
|
|
|
|