Я попытался поместить gm_xmlhttprequest в цикл while, но код выполняется синхронно. Можно ли заставить его выполняться асинхронно, по одному?
Можно ли выполнить gm_xmlhttprequest асинхронно?
Ответы (1)
самое простое изменение вашего кода будет следующим
function doXHR(counter) {
if (counter < count) {
var GoToURL = link;
GM_xmlhttpRequest({
method: "GET",
url: GoToURL,
onload: function(response) {
if (response.finalUrl.match(/true$/)) {
longList = longList + link;
}
doHXR(counter+1);
}
});
}
}
doXHR(0);
т. е. при загрузке запустите следующую итерацию... это приведет к тому, что запросы будут выполняться последовательно
Если вам нужно запустить этот код, то, когда все запросы будут выполнены, продолжайте делать что-то еще.
function doAllXHR(count, callback) {
function doXHR(counter) {
if (counter < count) {
var GoToURL = link;
GM_xmlhttpRequest({
method: "GET",
url: GoToURL,
onload: function(response) {
if (response.finalUrl.match(/true$/)) {
longList = longList + link;
}
doHXR(counter+1);
}
});
} else {
callback('done');
}
}
doXHR(0);
}
doAllXHR(20, function(result) {
console.log(result);
// and continue with whatever it is you do
});
person
Jaromanda X
schedule
24.08.2018
Я попробовал этот код, но он обрабатывает только первые несколько ссылок, а затем прекращает обработку остальных ссылок.
- person frosty; 24.08.2018
Точнее, счетчик идет от 0 до 1, а затем останавливается.
- person frosty; 24.08.2018
и обработчик
onerror
- вы, вероятно, получаете сообщение об ошибке - или, может быть, response.finalUrl
это undefined
- в консоли браузера (ctrl+shift+j) может быть сообщение об ошибке для вас
- person Jaromanda X; 24.08.2018
В консоли нет ошибки. Но когда я попытался предупредить счетчик, он просто предупреждает 0, затем 1, а затем просто останавливается.
- person frosty; 24.08.2018
Подождите... на самом деле в консоли есть некоторые ошибки.
- person frosty; 24.08.2018
вы видели мою опечатку?
doHXR(counter+1);
это неправильно - должно быть doXHR(counter+1);
- person Jaromanda X; 24.08.2018
Да, я исправил это некоторое время назад. Прямо сейчас я просто получаю несколько ошибок в консоли. Первый - Uncaught TypeError: невозможно прочитать свойство "длина" нулевого значения.
- person frosty; 24.08.2018
ну, это связано с кодом, который вы не публиковали — потому что вы никогда не пытаетесь получить доступ к свойству
.length
в любом опубликованном вами коде — возможно, поскольку вы на самом деле не публиковали много о код, который у вас есть, вы не правильно реализовали мое предложение
- person Jaromanda X; 24.08.2018
Не бери в голову. Я вызывал функцию внутри оператора if, и она прошла с первой и второй попытки, но не с третьей, поэтому функция перестала вызываться на третьем цикле. Я починил это. Спасибо, ваша функция работает отлично.
- person frosty; 24.08.2018
Ждать. Этот код. Я попытался добавить ссылки на файлы cookie внутри функции загрузки. Но это только добавляет последнюю ссылку снова и снова. Я думаю, что этот код все еще работает в то же время...
- person frosty; 24.08.2018
невозможно...
doXHR(1)
не будет выполняться до тех пор, пока не произойдет событие загрузки (т.е. завершено) doXHR(0)
- person Jaromanda X; 24.08.2018
Хорошо. Я отредактировал код. CheckIfAlreadyDidHits выше и ниже обе предупреждает каждый раз о разных ссылках, но та, что находится внутри функции onload, каждый раз оповещает одну и ту же ссылку, и она выполняется только ПОСЛЕ предупреждения checkIfAlreadyDidHits как выше, так и ниже.
- person frosty; 24.08.2018
Извините, вы можете не принимать или что-то еще, но я не собираюсь переписывать ответ, чтобы он соответствовал вашему новому неформатированному и невозможному для чтения коду - пожалуйста, отмените этот ответ, и я удалю его.
- person Jaromanda X; 24.08.2018
Вот почему в первый раз я использовал меньше кода, чтобы вам было легче его читать. Знаешь что? Я напишу более короткую примерную версию, а затем дам вам взглянуть на нее. Все хорошо?
- person frosty; 24.08.2018
Не бери в голову. Я его более или менее отладил, и теперь он работает.
- person frosty; 24.08.2018
but the code executes synchronously
— не устанавливайтеsynchronous:true
— поведение по умолчанию асинхронно, поэтому оно синхронно только потому, что вы установилиsynchronous:true
в аргументеdetails
- person Jaromanda X   schedule 24.08.2018asynchronously, one at a time
... эм... вы перепутали словаasynchronous
иsynchronous
- если запросы делать асинхронно, то все они будут выполняться сразу (не совсем так, но ждать нечего) - то, что вы хотите (но не делайте этого) для того, чтобы запросы выполнялись синхронно, чтобы вы могли выполнять их по одному... но не делайте этого... применяйте асинхронность - вы все равно можете выполнять один одновременно асинхронно - person Jaromanda X   schedule 24.08.2018synchronous:true
к объекту сведений, который вы передаетеgm_xmlhttprequest
, и ваш код будет вести себя так, как вы хотите - ясно, что создатели Greasemonkey подшучивают над вами, когда установкаsynchronous:true
делает запрос асинхронным - но вы знаете программистов, всегда хотелось бы посмеяться последним - я уверен, что MDN также намеренно вводит вас в заблуждение< /а> - person Jaromanda X   schedule 24.08.2018