Как я могу вернуть переменную, содержащуюся в цикле блока, в метод в pharo

Скажем, у меня есть метод, который реализует блок do:[] every:40s. В блоке есть данные значения, которые должны возвращаться при каждой задержке. Как я могу перенастроить это на метод в pharo следующим образом:

Class>>updateMethod

"This is a method"
| scheduler data |
scheduler := TaskScheduler new.
scheduler start.
"refresh every 40 seconds"
scheduler
   do: [a get: 'https://MyServer/json'.
        Transcript show: 'Refreshing......'; cr.
        data := NeoJSONReader fromString: a contents; cr.
   every: 60 seconds

1 ответ

Если я понимаю ваш вопрос, проблема заключается в том, что вы не можете использовать такое выражение, как ^data вернуть полученные данные, потому что оператор возврата ^ выйдет из блока.

Итак, для достижения желаемого поведения необходимо отправить полученные data в сообщении. Что-то на линии:

| scheduler data |
scheduler := TaskScheduler new.
scheduler start.
scheduler
  do: [a get: 'https://MyServer/json'.
    Transcript show: 'Refreshing......'; cr.
    data := NeoJSONReader fromString: a contents; cr.
    self processData: data].
  every: 40 seconds.

Таким образом, при каждой оценке блока ваш код будет иметь возможность получать новые data и обработать это правильно.

Приложение: селектор processData: это не что иное, как подсказка или заполнитель для реального сообщения, которое будет что-то делать с только что прочитанными данными. Другими словами, вы должны создать такой метод и поместить туда любую обработку, которая требуется в вашем приложении для данных. Что-то вроде

processData: data
  self
    validateData: data;
    doSomethingWith: data;
    "...blah..."
Другие вопросы по тегам