Cách chung để tiếp cận tái cấu trúc là xác định những gì khác nhau trong mã của bạn và giải nén đó là một phần động được chuyển vào một hàm có chứa mã chung.
Ví dụ, hai điều đó là khác nhau ở đây là con đường mà trên đó các yêu cầu xảy ra
'/companies' vs '/companies/:id'
Và con đường liên quan mà được thông qua để http.get
'/companies' vs '/companies/' + req.params.id
Bạn có thể trích xuất những điều này và chuyển chúng vào một hàm sẽ gán một trình xử lý cho bạn.
Dưới đây là một cách tiếp cận chung:
// props contains the route and
// a function that extracts the path from the request
function setupGet(router, props) {
router.get('/' + props.route, function(req, res, next) {
http.get({
host: 'http://api.com',
path: props.getPath(req)
}, function(response) {
var body = '';
response.on('data', function(d) {
body += d;
});
});
res.render('company', {
data: body
});
});
}
Và sau đó gọi nó với hai lựa chọn:
setupGet(router, {
route: 'companies',
getPath: function(req) {
return 'companies';
}
});
setupGet(router, {
route: 'companies/:id',
getPath: function(req) {
return 'companies' + req.params.id;
}
});
Lợi ích ở đây là bạn có thể sử dụng bất kỳ sự kết hợp của các tuyến đường và các đường dẫn cũng như sử dụng khác req
thuộc tính để xác định đường dẫn.
Một điều bạn cần phải nhận thức được rằng cuộc gọi res.render
của bạn sẽ xảy ra trước bạn làm body += d
, bởi vì trước đây xảy ra đồng bộ ngay sau khi cuộc gọi đến http.get
và sau này xảy ra không đồng bộ (đôi khi sau này).
Bạn có thể muốn đặt phương thức render
trong chính cuộc gọi lại.
// props contains the route and
// a function that extracts the path from the request
function setupGet(router, props) {
router.get('/' + props.route, function(req, res, next) {
http.get({
host: 'http://api.com',
path: props.getPath(req)
}, function(response) {
var body = '';
response.on('data', function(d) {
body += d;
// probably want to render here
res.render('company', {
data: body
});
});
});
});
}
điểm tốt. Tôi vẫn đang sử dụng công cụ async này tôi sẽ không thể tạo một mô hình để tôi có thể gọi/các công ty trong nhiều trang? Tôi yêu cầu vì async sẽ cần phải hoàn thành yêu cầu-phản ứng để có được dữ liệu. mỗi lần tôi sẽ cần phải hiển thị tất cả các công ty tôi sẽ cần phải thực hiện một yêu cầu http và gửi dữ liệu trong cuộc gọi lại? – handsome
Vâng, nếu các công ty không thay đổi, bạn có thể lưu trữ chúng trong bộ nhớ ở đâu đó và thực hiện yêu cầu lần đầu tiên, lưu các công ty, và sau đó mỗi lần sau đó chỉ trả lại giá trị đã lưu. Bạn có muốn tôi chỉnh sửa câu hỏi của tôi và cho bạn xem một ví dụ không? – nem035
có ý nghĩa nhưng tôi đang tìm kiếm một cái gì đó nhiều mô hình theo định hướng, như PHP cũ tốt để tôi có thể tái sử dụng logic thay vì làm cho tất cả những cuộc gọi http ở khắp mọi nơi. cảm ơn người đàn ông! – handsome