2016-03-30 22 views
2

Node/Javascript'i öğrenmeye başladım, başlangıçtaki sözleri kullanarak ('un sözünü kullanmadığını ve çoğu zaman başkalarının yanlarında olmadan nasıl davranacağını merak ediyorum). Superagent'ın nasıl bir söz verdiğini döndürme

yüzden bazen fs içeren bir dosyayı okuma gibi basit şeyler "promisify" gerekir:

var readFile = function(path) { 
    return new Promise(function(fulfill, reject) { 
     fs.readFile(path, function(err, data) { 
      if (err) { reject(err); } 
      else { fulfill(data); } 
     }); 
    }); 
}; 

Ve bu harika çalışıyor. Şimdi superagent ile aynı şeyi yapmam gerekiyor, ancak kullandığı zincirleme stili bana yapıştı.

var request = require('superagent'); 
request.get(...).set(...).set(...).end(callback); // stuck! 

Ben end() yöntemi değiştirmek ister (veya göz ardı ve yeni bir yöntem ekleyin) bir söz verir biriyle ederim. Böyle bir şey ...

var endQ = function() { 
    return new Promise(function(fulfill, reject) { 
     this.end(function(err, res) {  // "this" is the problem! 
      if (err) { reject(err); } 
      else { fulfill(res); } 
     }); 
    }); 
}; 

// then I could say this: 
request.get(...).set(...).set(...).endQ().then(function(res) { 
    // happiness 
}).catch(function(err) { 
    // sad about the error, but so happy about the promise! 
}); 

This question here nesnelere yöntemleri ekleyerek hakkında tavsiyeler her türlü vardır, ancak kesin bir şey olduğunu görmek zor. Özellikle this answer tarafından endişelendim. Tavsiyelerin çoğu, nesnenin "sınıfı" ile başlayan ve işlevi .prototype'a ekleyerek etrafında olur. Bunun gibi bir şey ....

// this part doesn't make sense 
var requestInstance = new Request(); // no such thing in request as far as I know 
requestInstance.prototype.endQ = endQ; // would be great, but no 

Sorunumu görüyor musunuz? "Sınıf" isteğini "sınıflandırma" ve bir yöntem ekleme JS eşdeğerini istiyorum, ancak bir modülü olduğundan, istek sınıfını daha fazla veya daha az opak olarak ele almam gerekiyor. Tüm superagent already supports promises ait

+0

https://www.npmjs.com/package/superagent-as:

İşte
Object.getPrototypeOf(request.get(...)).endQ = function() { // get to prototype and define /* your code here */ }; 

superagent kendisi yaptığı iştir:

İkincisi, ne yapmak istiyorum oldukça basittir -Daniel_L, –

+0

teşekkürler, bunu kontrol edecek. Sadece yaslanmış bir aşk uğruna, şu soruyu denediğimi mi yapıyorum? – user1272965

+0

http://stackoverflow.com/questions/29595449/how-promisifyall-works-or-what-are-the-requirements-for-it-work –

cevap

5

İlk: Düzenli then aksine then burada zaman bu bir söz olmadığını

request.get(...).set(...).set(...).then(response => { 
    // handle it here 
}); 

Not - oldukça aslında isteği çağırır ve tembel davranır.

exports.then = function then(resolve, reject) { 
    if (!this._fullfilledPromise) { 
    var self = this; 
    this._fullfilledPromise = new Promise(function(innerResolve, innerReject){ 
     self.end(function(err, res){ 
     if (err) innerReject(err); else innerResolve(res); 
     }); 
    }); 
    } 
    return this._fullfilledPromise.then(resolve, reject); 
} 
+0

Çok teşekkürler. Önereceğiniz yerel sözü kullanacağım, ama getPrototypeOf (request.get (...)) 'ile biraz kafam karıştı. GetPrototypeOf (istek) 'değil mi? Aksi halde, çağıran sonucun prototipini almaz mıydım? Tüm yardımlar için tekrar teşekkürler. – user1272965

İlgili konular