Как поделиться данными между двумя обработчиками событий? - PullRequest
0 голосов
/ 14 мая 2018

Я играю с разумом и скриптом, и в качестве упражнения я создал привязки для http.get (https://nodejs.org/docs/latest-v8.x/api/http.html#http_http_get_options_callback)

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

http.get('http://jsonplaceholder.typicode.com/posts/1', (res) => {
  let results = [];
  res.on('data', (chunk) => { results.push(chunk) });
  res.on('end', () => {
    console.log(results.join())
  });
});

То, что я пытаюсь использовать таким образом, потому что

Http.Client.get("http://jsonplaceholder.typicode.com/posts/1", response => {
  let results = [];
  Http.IncomingMessage.on(
    response,
    `data(
      data => {
        // Append data to results here, but how ? This line does not compile
        results = [data, ...results];
      },
    ),
  );

  Http.IncomingMessage.on(
    response,
    `_end(() => {
      // Print results
      Js.log("END")
    })
  )
});

results является неизменным, новое связывание не будет доступно из обратного вызова end. У вас есть идея, какрешить это?

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Ваша функция on имеет тип

(t, [ | `_end(unit => unit) | `data(Buffer.t => unit)]) => unit

таким образом, если вы хотите установить канал связи между двумя вызовами на on, единственный выбор, который у вас есть, - это использовать некоторые побочные вычисления, то есть изменяемый эталон , канал ввода / вывода, и т.д.

Если вы хотите придерживаться более функционального стиля программирования, вам следует рассмотреть возможность изменения типа возвращаемого значения ваших обработчиков на какой-то обитаемый тип, например, (t, ...) => result

Обычно такой стиль предполагает использование Promises , т. Е. Когда возвращаемое значение обработчика является обещанием. Это обеспечивает стиль программирования, при котором обработчики асинхронных событий могут безопасно взаимодействовать друг с другом без явной изменчивости.

0 голосов
/ 14 мая 2018

Мне удалось сделать это с помощью этого кода

Http.Client.get("http://jsonplaceholder.typicode.com/posts/1", response => {
  let results = [||];
  response
  |. Http.IncomingMessage.on(
       `data(
         data => {
           let results = Array.append(results, [|data|]);
           response
           |. Http.IncomingMessage.on(
                `_end(
                  () =>
                    Js.log(
                      results |> Buffer.concatArray |> Buffer.toString,
                    ),
                ),
              );
         },
       ),
     );
});

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

...