#javascript #node.js
#javascript #node.js
Вопрос:
Я новичок в Node.js .
И я пытаюсь продолжить изучение Node.js API .
Я сослался и написал поисковый робот, и код работает.
Я успешно разместил комментарий на веб-сайте.
Но меня смущает порядок выполнения с возвратом class — ClientRequest и
Обратный вызов .
var req = http.request(urlRequest,function(res){
console.log("Status: " res.statusCode);
console.log("headers: " JSON.stringify(res.headers));
res.on("data",function(chunk){
console.log(Buffer.isBuffer(chunk));
console.log(typeof chunk);
});
res.on("end",function(){
console.log("comment success!");
});
});
req.on('error',function(e) {
console.log("Error :" e.message);
});
req.write(postData);
req.end();
Мое первоначальное понимание шагов выглядит следующим образом :
1) http.request(urlRequest
2) function(res)
3) И последний возвращает класс ClientRequest var req
Но из кода кажется, что мое понимание неверно.
Это должен быть ClientRequest-class-object var req
«записать» комментарии и
считайте это ‘end’ и затем запускайте callbackFn function(res)
.
Пожалуйста, поделитесь своим мнением и расскажите мне больше об этом API.
Спасибо и наилучшие пожелания.
Ответ №1:
Кажется, что асинхронный характер http.request может вызывать у вас путаницу.
По сути, будет выполнен вызов запроса — это занимает некоторое время. Тем временем JS перейдет к req.write() и т.д.
Вам следует изучить отправители событий, вы уже используете их технически внутри обратного вызова запроса (например. res.on("data",function(chunk)
).
Возможно, лучшим решением было бы поместить вызовы вне запроса в другую функцию обратного вызова, которую вы затем вызываете внутри запроса. Это приведет к его вызову в конце запроса — о чем сигнализирует отправитель «end»:
res.on("end",function(){
console.log("comment success!");
requestWrite();
});
function requestWrite(){
req.write(postData);
req.end();
}
Комментарии:
1. Из вашего комментария, я полагаю, вы имеете
req.write(postData); req.end();
в виду, что будет оправдано послеfunction(res){res.on("end")}
? Но из кода видно, что ответ возвращается после отправки postData на сервер.2. Да, это было по недосмотру с моей стороны, но я все еще не уверен, к чему вы клоните в этом комментарии. Не могли бы вы использовать событие ‘response’, генерируемое вашим вызовом http.response? Это может быть немного сложнее, чем вам нужно, но я бы просмотрел некоторые примеры кода здесь для поиска решений или даже просто идей.