2013-06-12 11 views
8

Geçilen üç sözün sonucuna ihtiyacı olan bir işlev var. Biri doğrusal olarak bağımlıdır ve diğer ikisi eşzamanlı olarak çalışabilir. Ben üç vaatleri çözmek için q.all kullanmak istiyorum ve daha sonra .spread kullanarak sonuçları dördüncü elde. Benim kodum yine de çalışmıyor. Herhangi bir yardım takdir edilecektir.kriskowal/q node.js q.all ve yayın

var p1 = doWork(data); 
var p2 = p1.then(doMoreWork); 
var p3 = doConcurrentWork(data); 

return q.all([p1,p2,p3]).spread(funcWith3params) 
     .fail(function(err) { 
      console.log(err): 
     } 

nod-denetçisindeki kod iz, ilk 3 söz çağrılan görüyoruz. Bununla birlikte, .spread çağrıları çağrılmıyor. Neden olduğuna dair bir ipucu var mı? Ayrıca .fail de vurulmuyor.

+0

Orada bir kapanış '' 'yerleştirmeyi kastettiğinizi varsayalım. – Sukima

cevap

7

Çağrılar q.all dahili olarak yayılır. İşte

q.js gelen yaymak için kodudur: Dizi veya birinci argüman olarak bir diziye giderir bir söz bekler

Q.spread = spread; 
function spread(promise, fulfilled, rejected) { 
    return when(promise, function (valuesOrPromises) { 
     return all(valuesOrPromises).then(function (values) { 
      return fulfilled.apply(void 0, values); 
     }, rejected); 
    }, rejected); 
} 

Not söyledi.

nedenle çağrı gibi görünmelidir:

var p1 = doWork(data); 
var p2 = p1.then(doMoreWork); 
var p3 = doConcurrentWork(data); 

return q.spread([p1,p2,p3], funcWith3params, function(err) { 
     console.log(err): 
    }); 

Ancak, orijinal çağrı yanı çalışmalıdır. Neden olmadığından emin değil.

3

sağladığınız örnek ifade etmek en özlü yoludur: Ancak

var p1 = doWork(data); 
var p2 = p1.then(doMoreWork); 
var p3 = doConcurrentWork(data); 

return Q.spread([p1, p2, p3], funcWith3params) 
    .done(); 

, yazılı olarak orijinal doğrudur.

Sorunun bir veya daha fazla giriş vaatlerinin asla çözülmeyeceğinden şüpheleniyorum. Sorunu yalıtmak için zaman aşımlarını kullanmayı deneyin.

var p1 = doWork(data).timeout(1000, 'p1 timed out'); 
var p2 = p1.then(doMoreWork).timeout(1000, 'p2 timed out'); 
var p3 = doConcurrentWork(data).timeout(1000, 'p3 timed out'); 

return Q.spread([p1, p2, p3], funcWith3params) 
    .done(); 
+2

'.done() 'işlevini, hatalar olmadan ve bazı örneklerle birlikte gördüm. Bir fark ve/veya en iyi uygulama var mı? – Sukima

+2

@Sukima 'done()', söz zincirini açıkça kapatmak için kullanılır, yani artık 'işleyicilerin' biten 'çağrısının ötesine geçmesini bekleyemezsiniz. – Renaud