2012-07-11 19 views
9

REST API verilerini (kitaplık isteğini kullanarak) isteyerek bazı veriler alan bir düğüm komut dosyası yazdım. O kadar gibi fonksiyonların bir çift oluşur:'bu' sorunların async ve request gibi düğüm kütüphaneleri ile nasıl çözüleceğini

var data = { /* object to store all data */ }, 
function getKloutData() { 
    request(url, function() { /* store data */} 
} 
// and a function for twitter data 

Ben getirilirken sonra bazı şeyler yapmak istiyorum çünkü tüm tüm şöyle işlevlerini getirme çalıştırmak için kütüphane asenk kullandı:

async.parallel([ getTwitterData, getKloutData ], function() { 
    console.log('done'); 
}); 

Bu

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 */ }); 
}; 

Bu zaman uyumsuz çünkü çalışmaz ve bunu değiştirmek istiyoruz: tüm ancak ben de aynı anda birden çok hesabı getir böylece bir nesne modeli içindeki her şeyi koymak istedim, gayet iyi çalışıyor bağlamı.

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); 
}; 

temel yanlış falan mı yapıyorum: Ben onun etrafında alabilir tek yolu zaman uyumsuz ve istek yoluyla ben geçmesi herşeyi bağlama gereğidir? Bence senaryona geri dönüp bunu child_processes'a bırakmanın çok fazla yüke yol açtığını düşünüyorum.

cevap

9

Tam olarak doğru yapıyorsunuz.

alternatif yerine bind kullanarak bağlamında daima nesneye bir başvuru tutmak için, ama bu bazı jimnastik gerektirir: Ayrıca önceden bağlayıcı yapabilirsiniz

Fetcher.prototype.init = function() { 
    var self = this; 
    async.parallel([ 
     function(){ return self.getTwitterData() }, 
     function(){ return self.getKloutData() } 
    ], function() { 
     console.log('done'); 
    }); 
} 

Fetcher.prototype.getKloutData = function(callback) { 
    var self = this; 

    function saveData() { 
     // store data 
     self.blah(); 
    } 

    request(url, saveData); 
}; 

:

Fetcher.prototype.bindAll = function(){ 
    this.getKloutData = this.prototype.getKloutData.bind(this); 
    this.getTwitterData = this.prototype.getTwitterData.bind(this); 
}; 

Fetcher.prototype.init = function(){ 
    this.bindAll(); 
    async.parallel([ this.getTwitterData, this.getKloutData ], function() { 
     console.log('done'); 
    }); 
}; 
+3

Underscore kütüphanesi bu daha az ağrılı hale getirir bindAll' 'adlı yararlı bir işlevi vardır. Ve eğer CoffeeScript'i seçerseniz, yöntemleri sadece yağ oku ile tanımlayabilirsiniz ve hiç bir şekilde açık bir bağlayıcılık yapmak zorunda kalmayacaksınız. –

3

başka değişkene içine bu kaydedebilirsiniz:

var me = this; 

Ardından me sizin this olduğunu.

0

Bu işlevle Instantiate nesnesi:

function newClass(klass) { 
    var obj = new klass; 

    $.map(obj, function(value, key) { 
     if (typeof value == "function") { 
      obj[key] = value.bind(obj); 
     } 
    }); 

    return obj; 
} 

Bu au yapacak Tüm fonksiyonların tomatik bağlanması, böylece nesneler içindeki nesnelerin içeriğine sahip olduğunda, OMP stili, nesnesinde nesne alacaksınız.

var obj = new Fetcher(); 

Ama:

Yani aracılığıyla değil nesneleri örneğini

var obj = newClass(Fetcher); 
+0

Orijinal sorum, jQuery'nin mantıklı olmadığı bir nodejs ortamındaydı. Ayrıca alt çizgi ve lodash'daki “bindAll” yöntemleri (tüm JS ortamlarında çalışan lib'lar) bunu sizin için yapacak şekilde tasarlanmıştır. – askmike