• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Решено передача параметров внутрь cb функции

alucky

New member
Добрый день!

столкнулся с проблемой передачи дополнительных параметров в callback функцию.

задача: скачать по http файл и сохранить его с определенным именем.
имеется окружение, которое получает json следующего вида:
Код:
{
  "url":"http://server/test.lua",
  "saveas":"test1.lua"
}
код в котором вызывается скачивание:
Код:
-- выше получаю JSON String в переменную json
-- и запускаю скачивание:
dofile("download.lc")(json)
Код:
--download.lua
return function (json)
    local decoder=sjson.decoder()
    decoder:write(json)
    json=decoder:result()
    local function save(code, data, headers)
        if (code < 0) then
          print("HTTP request failed")
        else
          -- тут хочу вызвать fd = file.open(json['saveas'], "w")
          -- а оно nil
        end
    end
    http.get(json['url'].."?"..json['saveas'], nil, save)
    json=nil
    decoder=nil
end
памагителюдидобрые!
 

NeoroN

Member
Код:
download  = loadfile("download.lc")
download(json)
download=nil
dofile просто выполняет файл без передачи ему параметров а loadfile загрузит результат - функцию
 

alucky

New member
Код:
download  = loadfile("download.lc")
download(json)
download=nil
dofile просто выполняет файл без передачи ему параметров а loadfile загрузит результат - функцию
проблема не в этом - везде кроме cb функции save переменная json видна.

тут скорее проблема в том, что http.get(json['url'].."?"..json['saveas'], nil, save) форкается и выполняется в отдельном потоке, чтобы кристалл не "висел" пока файл не загрузится - tcp запросы могут быть долгими (поправьте меня если я не прав?)

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

как видно из кода, я даже попробовал имя сохраняемого файла передать в GET запросе, чтобы потом его поймать, но никакой информации нет даже об URL с которого идет скачивание внутри cb. даже headers не дает никакой информации
 

NeoroN

Member
Проблема в том что функция обьявленная local
А если так написать?
Код:
    http.get(json['url'].."?"..json['saveas'], nil, function (code, data, headers)
        if (code < 0) then
          print("HTTP request failed")
        else
          -- тут хочу вызвать fd = file.open(json['saveas'], "w")
          -- а оно nil
        end
    end)
 

alucky

New member
убрал local - все равно ничего не появилось в окружении.

проблема так и не решена :(
пришлось писать еще и файл-менеджер
 

Юрий Ботов

Moderator
Команда форума
А может просто строка json = nil отрабатывает до того как запускается callback :) ? (а это скорее всего)
перенесите ее внутрь калбэка...
 

alucky

New member
А может просто строка json = nil отрабатывает до того как запускается callback :) ? (а это скорее всего)
перенесите ее внутрь калбэка...
перехитрил себя( слишком меня проблемы с памятью волнуют - при любом объявлении переменной, сразу же в конец ее чистку ставлю

получилось! спасибо!
 
Сверху Снизу