Синхронное выполнение GM_xmlhttpRequest
Здравствуйте!
Пишу юзер-скрипт для Мозиллы, суть скрипта: есть некий сайт, на сайте темы, алгоритмом нужно последовательно пройти по всем темам и собрать некую информацию. В работе использую функцию GM_xmlhttpRequest из API Greasemonkey. Собственно столкнулся с проблемой, подозреваю, что проблема крайне известная и заключается в асинхронности xhr, мне нужно чтобы выполнение запросов к каждому топику было синхронным, т. е. посыл/прием запросов был последовательным для каждой темы. Собственно код функции, которая запускается мнгновенно при переходе на нужну страницу. function checkAllTopics() { var start = 1, finish = 10, inc = 0, baselink = "http://example.com/?id=", fullLink = ''; function sendXHR(index, link) { //функция обертка для xhr, с помощью нее я думал сделать запросы синхронными. fullLink = link + index; GM_xmlhttpRequest({ method: "GET", url: fullLink, onload: function(response) { console.log("so this is a result of " + start + ", " + response.status); //здесь мы просто выводим айдишник темы и статус ответа сервера if (response.status == 200) { inc++; //здесь логика - если ответ сервака ОК, то делаем инкремент счетчика console.log(this.url, response.status); //это еще один проверочный вывод инфы для того, чтобы убедиться в том, как все работает } } }); } for (; start <= finish; start++) { sendXHR(start, baselink); //здесь организуем цикл-пробег по всем темам. } console.log(inc); // а здесь в итоге выводим тот самый счетчик, который покажет нам количество успешных обращений к серверу. } checkAllTopics(); А вот что выводи консоль при выполнении: Код:
[19:46:44.584] 0 // вывелось значение, которое должно было отобразиться в конце выполнения функции Заранее благодарю! |
примерно так:
function checkAllTopics() { var start = 1, finish = 10, inc = 0, baselink = "http://example.com/?id=", fullLink = ''; function sendXHR(index, link, callback) { //функция обертка для xhr, с помощью нее я думал сделать запросы синхронными. fullLink = link + index; GM_xmlhttpRequest({ method: "GET", url: fullLink, onload: function(response) { console.log("so this is a result of " + index + ", " + response.status); //здесь мы просто выводим айдишник темы и статус ответа сервера if (response.status == 200) { inc++; //здесь логика - если ответ сервака ОК, то делаем инкремент счетчика console.log(this.url, response.status); //это еще один проверочный вывод инфы для того, чтобы убедиться в том, как все работает } callback(); } }); } (function _go() { if (start <= finish) { sendXHR(start++, baselink, _go); } else { console.log(inc); // а здесь в итоге выводим тот самый счетчик, который покажет нам количество успешных обращений к серверу. } })(); } checkAllTopics(); обошлись без синхронности |
Спасибо, все замечательно отработало!
|
Часовой пояс GMT +3, время: 04:41. |