我已經編寫了一個節點腳本,通過請求REST API數據(使用庫請求)獲取一些數據。它包括像這樣幾個功能:如何解決'this'問題,如異步和請求
var data = { /* object to store all data */ },
function getKloutData() {
request(url, function() { /* store data */}
}
// and a function for twitter data
因爲我想取後做一些東西,所有我使用的庫異步運行所有抓取功能,像這樣:
async.parallel([ getTwitterData, getKloutData ], function() {
console.log('done');
});
這一切工作正常,但是我希望把一切對象模式裏面,所以我可以在同一時間內獲取多個帳戶:
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 */ });
};
這並不因爲異步工作,要求改變這種上下文。我可以繞過它的唯一途徑是通過異步和要求結合我的一切傳:
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);
};
我做得不對基本的東西?我認爲恢復到腳本並將其分叉到child_processes會產生很多開銷。
下劃線庫有一個名爲'bindAll'一個方便的功能,使這個痛苦少。如果您選擇使用CoffeeScript,則可以使用胖箭頭定義方法,而不必進行任何顯式綁定。 – 2012-07-11 09:05:22