Корона SDK Lua сеть. Задержка запроса - PullRequest
0 голосов
/ 10 января 2012

Я новичок в Corona SDK и языке Lua, и у меня возникли некоторые проблемы ..

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

Проблема в том, что когда я вызываю переменную с ответом на данные вне функции слушателя, она выглядит как nil. Я установил небольшой таймер, чтобы отслеживать, была ли проблема из-за промежутка времени между запросом и ответом, и кажется, что это так (но я не уверен на 100%) Я не хочу использовать пользовательскую задержку для выполнения этой операции.

Есть ли способ приостановить выполнение сценария до ответа слушателя, а затем продолжить выполнение? Я пробовал с сопрограммами, но я не мог решить это ..

local data

function networkListener( event )
    if ( event.isError ) then
        print( "Network error!")
    else
    --print ( "RESPONSE: " .. event.response )

        data = json.decode(event.response)

        print( data[1].start_date ) --working great

    end -- end of else statement
end


network.request( "http://localhost/mysite/myphpmethod" , "GET", networkListener )

print(data) -- error: attempt to index upvalue 'data' ( a nil value ) 

local function printIt()
    print( data[1].start_date)
end

timer.performWithDelay(1000, printIt, 1); -- this works 

Ответы [ 3 ]

1 голос
/ 10 января 2012

HTTP-вызов является асинхронным, что означает, что ваша печать (данные) почти всегда будет пустой, даже в момент неудачного выполнения executeWithDelay может быть пустым.

Вам нужно будет разработать свое приложение таким образом, чтобы код игры продолжался в networkListener () (в данном конкретном случае вы вызывали бы printIt () из networkListener ().

Это требует некоторого обдумывания и изменения дизайна, но это не так уж и плохо.

0 голосов
/ 06 апреля 2015

Самый простой способ - это сделать запрос и открыть новую кнопку, которая затем делает все, что вам нужно с данными, многие хорошие сайты делают это.Вы также можете использовать event.phase == "закончено", но не уверены, насколько хорошо это работает.

0 голосов
/ 19 марта 2014

Вы также можете вызвать native.setActivityIndicator (true) при отправке запроса на сервер и остановить индикатор (native.setActivityIndicator (false)) в event.response.Поэтому, когда вы получаете ответ от сервера, вы можете делать свои вещи.

...