2016-03-26 15 views
0

Bu yüzden, özel bir "nesne" olarak çalışmak istediğim bazı JS kodlarım var ancak JS'nin doğası gereği bunu yapamıyorum.Bir javascript işlevinin/"sınıfının" parametrelerini eşzamansız olarak değiştirin.

: Ben bu yüzden bu aramaya çalıştığımda

var mongoose = require('mongoose'); 
var dbservice = function() { 
    this.connected = false; 
    this.connection_error = false; 
    this.status_messages = []; 
    this.connect = function() { 
     mongoose.connect('Laaaadeedaaaa'); 
     var db = mongoose.connection; 
     db.on('error', function() { 
      this.status_messages.push('Nooo! Connection Error'); 
      console.error.bind(console, 'Nooo! Connection Error: '); 
      this.connection_error = true; 
     }); 
     db.once('open', function() { 
      this.status_messages.push('Successfully connected to the database!'); 
      console.log('Successfully connected to the database!'); 
      this.connected = true; 
     }); 
    }; 
    //DB (db.runCommand({whatsmyuri: 1})) 
    this.createUser = function(user_in, password_in) { 
     require("./data/models/user"); 
     var User = mongoose.model('User'); 
     var newUser = new User({ username: user_in, password: password_in, date_created: Date() }); 
     newUser.save(function(err, data) { 
      if (err) { 
       this.status_messages.push('User creation error!'); 
       console.log(err); 
      } 
      else { 
       this.status_messages.push('Success!'); 
       console.log('Success:', data); 
      } 
     }); 
    }; 
}; 
module.exports = dbservice; 

:

Yani bir yerde çevrimiçi bir blog takip ettik ve (bana kadar zarif görünüyor ama muhtemelen ne) çözümü bu yazdım

var cur_service = new dbservice(); 
cur_service.connect(); 
setTimeout(function() { 
    console.log("Connected!"); 
    console.log(cur_service.connected); 
},3000); 

Esasen ne olduğu this.connect'un başarılı bir şekilde çalışmasıdır (yay) ve kendini hızlı bir şekilde tamamlar (çünkü mongoose işlevleri eşzamansızdır). Yaklaşık 1 saniye sonra konsol, beklendiği gibi Successfully connected to the database çıktı. Bununla birlikte, zamanlayıcı işaretlendiğinde, cur_service.connected hala yanlıştır; bu, doğru olarak ayarladığım ve async işlevinin tamamen tamamlandığı gibi kafa karıştırıcıdır. Bu, this.blah = biçiminin, uyumsuz döndürmelerde uygun olmadığı anlamına gelir. Peki bunu nasıl çözeceksin? Fark etmediğim başka bir temel sözdizimi hatası var mı? Js geliştirmeye yeni başladım (sadece gerçekten iOS/Desktop/C++ kullanıyordum) bu yüzden bu gerçekten yeni ve soyut: P

Yardımlarınız için teşekkürler!

+0

* "JS gibi bir sınıf olarak çalıştırmak istediğim bazı JS kodlarım var ama açıkçası bunu yapamam." * - Üzgünüm, ne? – Tomalak

+0

İlk cümlenizi anlamıyorum. Bu bir yana, nihayetinde başarmaya çalıştığınız şey tamamen açık değil. Ayrıca, bu * kullanımını * kullanmanız gerektiğini de bilmelisiniz ki JS muhtemelen alıştığınız gibi değil. –

+0

Burada bir sürü sorun var."Bu", dbservice() 'de, sadece basit bir işlev çağrısı ise yeni bir nesne oluşturma değil, yararlı bir değere sahip olmayacak. Ve, 'bu', tüm geri çağırma işlevlerinde kaybolur, çünkü bu genellikle bir geri aramada korunmaz. – jfriend00

cevap

1

Geri arama işlevleri genellikle üst kapsam olarak aynı this değerine sahip değil. Bununla başa çıkmanın birçok yolu vardır, ancak this değerini this değerini self gibi bir ad olarak adlandırılan üst düzey kapsamlı bir değişkene kaydetmek ve this referansını kullanmak yerine self numaralı referansa geri dönmek. Bunun bir örneği buradadır:

Genelde
var mongoose = require('mongoose'); 
var dbservice = function() { 
    var self = this; 
    this.connected = false; 
    this.connection_error = false; 
    this.status_messages = []; 
    this.connect = function(cb) { 
     mongoose.connect('Laaaadeedaaaa'); 
     var db = mongoose.connection; 
     db.on('error', function(err) { 
      // use self in here to reference the parent object 
      self.status_messages.push('Nooo! Connection Error'); 
      console.error.bind(console, 'Nooo! Connection Error: '); 
      self.connection_error = true; 
      callback(err); 
     }); 
     db.once('open', function() { 
      self.status_messages.push('Successfully connected to the database!'); 
      console.log('Successfully connected to the database!'); 
      self.connected = true; 
      // signal completion of the connection 
      callback(null); 
     }); 
    }; 
    //DB (db.runCommand({whatsmyuri: 1})) 
    this.createUser = function(user_in, password_in, callback) { 
     var self = this; 
     require("./data/models/user"); 
     var User = mongoose.model('User'); 
     var newUser = new User({ username: user_in, password: password_in, date_created: Date() }); 
     newUser.save(function(err, data) { 
      if (err) { 
       self.status_messages.push('User creation error!'); 
       console.log(err); 
      } 
      else { 
       self.status_messages.push('Success!'); 
       console.log('Success:', data); 
      } 
      callback(err, data); 
     }); 
    }; 
}; 
module.exports = dbservice; 

, sana nesne devlet olarak, bir tamamlama geri arama geri argümanlar olarak zaman uyumsuz sonuçları DEĞİL iletişim olmak istiyorum düşünüyorum. Bunun nedeni, nesne durumu ayarlandığında veya ayarlanmadığında hiçbir fikriniz olmadığıdır. Sadece, bu noktada bir tamamlama geri çağrısı çağrıldığında, sadece yukarıda gördüğüm gibi geri arama için arşive dönüştürebileceğinizi biliyorsunuzdur. gibi dbservice arama yaparken yeni bir nesne örneği Bu yalnızca işe yarayabilir

:

var dbservice = require('dbservice'); 
var d = new dbservice(); 
d.connect(function(err) { 
    if (!err) { 
     d.createUser("bob", "password", function(err) { 
      if (!err) { 
       // user created here 
      } 
     }); 
    } 
}); 

burada sahip başka konu geri aramalar kullanma veya sonuna sinyal vaat edilmesi gerektiğidir Asenkron çalışma, işlemin ne zaman yapılacağı için bir zamanlayıcı tahminde bulunmaz. Size genel kavramı göstermek için mevcut kodunuza bazı geri bildirimler ekledim, ancak hataları doğru bir şekilde döndürme konusunda da gayretli olmalısınız.

Gerçekten çok fazla eşzamansız bir kod yazacaksanız, gerçekten, sözlü ifadeleri nasıl kullanacağınızı öğrenmek istiyorsunuz, çünkü LOT'leri daha kolay uyumsuz hale getirerek uyumsuz zincirleme ve hata yapmalarını kolaylaştırıyorsunuz. düz geri çağrıları almak yerine vaatler vermek için) ve vaatleri en iyi şekilde nasıl kullanacağınızı öğrenin.

+0

@Imranahmed - Kodunuza geri aramalar ve 'self' ekledim ve ne zaman yapılacağını tahmin etmek için zamanlayıcıları kullanmadan güvenli bir şekilde nasıl arayacağınıza dair bir örnek gösterdim. Bu, genel kavramları göstermek için kodunuzla ilgili ham bir örnektir. Kendimi farklı bir şekilde kendim tasarlarım. – jfriend00

+0

Detaylandırma @ jfriend00 için çok teşekkürler - bu kesinlikle çok yararlı! Bunu şimdi uygulamaya çalışmam için bir göz atacağım. Ayrıca, tavsiye için teşekkürler wrt. geri aramaları! Bunu bir zamanlayıcıya yerleştirmemin gerçek nedeni, kodun içinde tam olarak neyin yanlış gittiğini ayıklamaktı. Bir web sitesi çalıştırırken bunun neden uygun olmadığını anlıyorum. –

+0

Oh, bu geri çağrılar inanılmaz! Bunun için çok teşekkür ederim! Bunların böyle olabileceğini hiç bilmiyordum haha! –

İlgili konular