Düğüm içinde bazı işlevleri birlikte toplamak için bir ES6 sınıfı kullanıyorum. İşte (temelde) gibi görünüyor: Ben ES6 sınıfları ile, yol, ortak değişkenler basitçe this
referans oldu ve bir yapıcı aracılığıyla bu değişkenleri başlatmak için bir yol atamak düşündümES6 yöntemleri null olsun "this" ve sınıf değişkenlerine erişilemiyor
class processDocs {
constructor(id) {
this.id = id;
// console.log(this) returns { id: id }
}
getDocs(cb) {
// console.log(this) returns null
docs
.query(qb => {
qb.where('id', this.id);
})
.fetch()
.then(function(documents) {
cb(null, documents);
})
;
}
alterDocs(documents, cb) {
//some logic
}
reindexSearch(cb) {
//some logic
}
process() {
// console.log(this) returns { id: id }
async.waterfall([
this.getDocs,
this.alterDocs,
this.reindexSearch
]);
}
}
export default processDocs;
o nasıl görüneceği tam olarak sınıf tanımımda. Ben yapıcı dan this
dışarı console.log
zaman, İşte
var Processor = require('./processDocs');
var pr = new Processor(id);
var docs;
pr.process();
mesele, ben tahmin olarak benim { id: id }
değeri elde;: I (ayrı bir dosyada) sınıfı çağırıyorum nasıl İşte
var Ancak, process
çalıştığında this
oturumunu kapattığımda, process
çalışıyor, null. AMA, process()
içinde this
çıkışım hemen önce şelaleden önce, orijinal nesneyi alıyorum.
Bunun için herhangi bir sebep var mı? v0.10.33
ve babel-düğümünü 4.6.6
ve ben --harmony
bayrağıyla babel-düğümü çalıştırın:
Btw, ben düğüm kullanıyorum. Herhangi biri sormadan önce, v0.10.x
adresinde sıkışmış olan büyük bir bağımlılık nedeniyle daha yeni bir Düğüm versiyonunu güncelleyemiyorum.
EDIT Bir geçici çözüm oluşturmayı başardım ancak çok es6 benzeri değil. Sorun, async.waterfall
ile görünüyor. Bunu düzeltmek için bir .bind
kullanmak zorunda kaldı:
async.waterfall([
this.getDocs.bind(this),
this.alterDocs.bind(this),
this.reindexSearch.bind(this)
]);
sana "çok ES6 benzeri olmayan" ile ne demek alamadım bu konuda okuyabilir? Yöntemler, kendilerine ait değildir, değildir ve kendilerine bağlı olmayacaktır. Btw, eğer gerçek bir ES6 kodu istiyorsanız, o zaman “async” öğesini not edin ve vaatleri kullanın. – Bergi
Ben çok "es6-like" demiyorum çünkü ".bind (this)" 'i kullanmam gerektiğinde kullanmam gerekiyordu. Yani bir dersten bir metot çağırırsam, “bu” nın kaybolacağını mı söylüyorsun? Çünkü bu bana mantıklı gelmiyor. Pr.process() 'yi kullandığımda, bu doğruydu ve this.process()' den this.getDocs 'i çağırdığımda,' bu 'özelliğini de korudu. Bu bir "async" sorunu gibi görünüyor. Ayrıca, Çok ES6 gibi olmak isteseydim, jeneratörler kullanırdım :) Vaatler ES5'tir ve yine de 'async' kullanarak engellemeye çalıştığım şey olan geri arama cehennemine neden olur. – antjanus
Neden .bind() 'i kullanmaya ihtiyacınız olmadığını düşünüyorsunuz? Geçiş referanslarınız başka bir yerdedir. Siz onları * sınıfınızın içinden davet etmiyorsunuz! Vaatler burada uygun çözümdür (çok fazla ES6! Jeneratörler asenkron bir özellik değildir!): 'Process() {return this.getDocs(). Sonra (docs => this.alterDocs (docs)). alteredDocs => his.redindexSearch (alteredDocs)); } ' – Bergi