Почему NodeJS может запросить форму отправки позже, используя Цепной API? - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь выяснить, почему мы можем установить форму для запроса на публикацию, используя .form после того, как я позвонил request.post.

Это фрагмент кода из официального документа

request.post('http://service.com/upload', {form:{key:'value'}})
// or
request.post('http://service.com/upload').form({key:'value'})
// or
request.post({url:'http://service.com/upload', form: {key:'value'}}, 
function(err,httpResponse,body){ /* ... */ })

Я запутался во втором примере request.post('http://service.com/upload').form({key:'value'}).На мой взгляд, это не должно работать, поскольку после вызова request.post (...) запрос будет отправлен.И тогда звонок на .form, как будто вы настраиваете почтовую форму после того, как запрос был отправлен.Так как это может работать?Что-то не так?

1 Ответ

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

А затем вызов .form выглядит так, как будто вы настраиваете почтовую форму после отправки запроса. Так как это может работать?

Видимо, когда вы делаете это:

request.post('http://service.com/upload')

Запрос отправляется не сразу. Вместо этого он регистрируется (с setImmediate() или process.nextTick()) для отправки на следующем тике цикла событий.

Итак, когда вы выполняете request(...).form({key:'value'}), .form() получает шанс изменить запрос до его отправки.

В документе для .post(), есть это утверждение, которое объясняет:

В сложных случаях вы можете получить доступ к самому объекту данных формы через r.form (). Это может быть изменено, пока запрос не будет запущен в следующем цикле цикла обработки событий. (Обратите внимание, что эта вызывающая форма () удалит текущие установленные данные формы для этого запроса.)

В приведенном выше утверждении r - это возвращаемое значение от вызова request.post(), поэтому r.form() относится к request.post(...).form(...), что является вашей конкретной ситуацией.

И, в исходный код это комментарий:

// start() is called once we are ready to send the outgoing HTTP request.
// this is usually called on the first write(), end() or on nextTick()
...