Исходник Гайд Асинхронные HTTP запросы в MoonLoader

Статус
В этой теме нельзя размещать новые ответы.

Lyonya Decart

Участник
140
22
Короче, вроде решил проблему с вылетами асинхронов, может кому пригодится:

Была проблема, что при использовании функции cover'a в цикле, вне зависимости от задержки и проверок, асинхроны улетали вместе с игрой в закат.
Колупался 4 дня, чтобы найти способы это пофиксить, делал жуткие костыли и не жуткие, ничего не помогало. Решении проблемы пришло само и совершенно простое.

Что мне помогло? Из функции асинхронного запроса cover'a я убрал создание потока, а саму функцию, содержащую асинхрон, запускал в другом потоке.
Другими словами получилось так:
Ваша функция с асинхронами:
Lua:
function getAsync() -- ваша функция, содержащая асинхроны
 for i = 1, 100 do -- сам цикл. Пробовал и While и For и Repeat. Результат одинаковый - не вылетает.
  asyncHttpRequest('GET', "ваша ссылочка", nil,
     function(response)
      -- код ответа
     end,
     function(err)
      -- код ошибки
      sampAddChatMessage('{6600FF}Нет связи')
  end)
 end
end
Функция запроса от cover'a:
Lua:
function asyncHttpRequest(method, url, args, resolve, reject)
   local request_thread = effil.thread(function (method, url, args)
      local requests = require 'requests'
      local result, response = pcall(requests.request, method, url, args)
      if result then
         response.json, response.xml = nil, nil
         return true, response
      else
         return false, response
      end
   end)(method, url, args)
   if not resolve then resolve = function() end end
   if not reject then reject = function() end end
    --lua_thread.create(function() -- здесь я и убрал поток
      local runner = request_thread
      while true do
         local status, err = runner:status()
         if not err then
            if status == 'completed' then
               local result, response = runner:get()
               if result then
                  resolve(response)
               else
                  reject(response)
               end
               return
            elseif status == 'canceled' then
               return reject(status)
            end
         else
            return reject(err)
         end
         wait(0)
      end
   --end) -- конец убранного потока
end
Вызов функции с асинхронами где-то внути кода:
Lua:
lua_thread.create(function()
 --Ваш код
  getAsync()
 -- Ваш код х2
end)
-- Либо
lua_thread.create(getAsync)

Мне помогло, проработал скрипт 10 минут +-, дальше не стал проверять, работает, данные передаются в лучшем виде, фризов не наблюдал. Запускал до 5 циклов одновременно (с разными переменными и задачами, естественно), тоже работает без искажений и вылетов.

P.S. Интересно, что если запустить два разных потока с двумя функциями с асинхронами, вылетов тоже не замечается.

попробовал твой фикс, изначально вроде все норм было, а потом вылеты продолжились
upload_2019-6-19_17-56-4.png
 

ImPasha

Software Developer & System Administrator
Друг
1,788
2,142
попробовал твой фикс, изначально вроде все норм было, а потом вылеты продолжились
Просто не надо так часто вызывать асинхронные запросы. Сделай небольшой промежуток между ними, либо прочитай новые способы в начале темы.
 

FYP

Известный
Автор темы
Администратор
1,764
5,923
закрыто, поскольку люди, игнорируя предупреждения, продолжают использовать нестабильные решения и жалуются здесь о проблемах.
 
Статус
В этой теме нельзя размещать новые ответы.