• Система автоматизации с открытым исходным кодом на базе 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 :) ? (а это скорее всего)
перенесите ее внутрь калбэка...
перехитрил себя( слишком меня проблемы с памятью волнуют - при любом объявлении переменной, сразу же в конец ее чистку ставлю

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