Tôi đã viết một tập lệnh nút lấy một số dữ liệu bằng cách yêu cầu dữ liệu REST API (sử dụng yêu cầu thư viện). Nó bao gồm một vài chức năng như vậy:cách giải quyết vấn đề 'này' với các thư viện nút như không đồng bộ và yêu cầu
var data = { /* object to store all data */ },
function getKloutData() {
request(url, function() { /* store data */}
}
// and a function for twitter data
Bởi vì tôi muốn làm một số nội dung sau khi lấy tất cả các tôi đã sử dụng async thư viện để chạy tất cả các lấy các chức năng như vậy:
async.parallel([ getTwitterData, getKloutData ], function() {
console.log('done');
});
này tất cả đều hoạt động tốt, tuy nhiên tôi muốn đặt mọi thứ bên trong một mẫu đối tượng để tôi có thể tìm nạp nhiều tài khoản cùng một lúc:
function Fetcher(name) {
this.userID = ''
this.user = { /* data */ }
this.init();
}
Fetcher.prototype.init = function() {
async.parallel([ this.getTwitterData, this.getKloutData ], function() {
console.log('done');
});
}
Fetcher.prototype.getKloutData = function(callback) {
request(url, function() { /* store data */ });
};
Điều này không hoạt động vì không đồng bộ và yêu cầu thay đổi điều này bối cảnh. Cách duy nhất tôi có thể giải quyết vấn đề này là ràng buộc mọi thứ tôi chuyển qua async và yêu cầu:
Fetcher.prototype.init = function() {
async.parallel([ this.getTwitterData.bind(this), this.getKloutData.bind(this) ], function() {
console.log('done');
});
}
Fetcher.prototype.getKloutData = function(callback) {
function saveData() {
/* store data */
}
request(url, saveData.bind(this);
};
Tôi đang làm gì đó sai cơ bản hay gì đó? Tôi nghĩ rằng quay trở lại kịch bản và forking nó để child_processes tạo ra nhiều chi phí.
Thư viện gạch có một chức năng tiện dụng được gọi là 'bindAll' mà làm này ít đau đớn. Và nếu bạn chọn CoffeeScript, bạn chỉ có thể xác định các phương pháp với mũi tên chất béo và bạn sẽ không phải thực hiện bất kỳ ràng buộc rõ ràng nào cả. –