2016-03-23 30 views
0

benim getLoc fonksiyonu I'de benim ana işleviDeğeri() tanımlanmamış

for i..10 
    for i...5 
     var promise = getLoc(x,y); 
     promise.then(function(value) { 
      //value is undefined... 
     } 

içinde aşağıdaki gibi bir API iki döngüler kullanmak çağırmak için Q.js kullanmak benim .sonra için deferred.resolve (değer) kullanarak döndü sahiplerim neden tanımlı değil, o zaman işlevine iletilen değer tanımlanmamıştır? Çözülen değeri nasıl iletebilirim? Teşekkürler! bu değer bilindiği tek yer orası böylece geri arama gelecekte bazen denir çünkü

+0

Sadece [ertelenmiş antipattern] kaçınmak (http://stackoverflow.com/q/23803743/1048572) ve problem kendi kendine gider! – Bergi

+1

Olası kopyaları [Birbiri ardı ardına vaatler (yani sırayla)?] (Http://stackoverflow.com/questions/24586110/resolve-promises-one-after-another-ie-in-sequence) –

+0

Doğru davranış . 'Defferred.resolve (value)' olarak adlandırdığınız noktada '' value' undefined. –

cevap

2

Sen zaman uyumsuz geri arama içeride resolve() aramak zorunda:

function getLoc(x,y) { 
    var deferred = Q.defer(); 
    Q.ninvoke(request, 'get', { // ... other options here 
    }).spread(function(response, body) { 
    deferred.resolve(body); 
    }); 

    return deferred.promise; 
} 

Sen zaman uyumsuz geri arama önce değerini döndürmek için çalışıyorlardı Hatta çağrıldı ve böylece her zaman undefined idi. o Q.ninvoke() bir söz verir gibi göründüğünden, sadece bunu yapmak ve ortak bir ertelenmiş antipattern önleyebilirsiniz

Veya:

function getLoc(x,y) { 
    return Q.ninvoke(request, 'get', { // ... other options here 
    }).spread(function(response, body) { 
    return body; 
    }); 
} 
+0

Umarım bunu antipattern olarak tanımlamışsınızdır ve hali hazırda uygun bir çözüm üzerinde çalışmışsınızdır… – Bergi

+0

Eh, sözler hakkında biraz bilgi sahibi olduğunuzu ve temelde hepsi aynı :-) olduğunu düşündüğümden eminim [Bluebird docs of spread '] (http://bluebirdjs.com/docs/api/spread.html)? – Bergi

+1

@Bergi - Daha iyi bir yol ekledim. Ben Q'yu tanımıyorum ve bunu öğrenmeye niyetim yok, bu yüzden ilk başta bariz hataya gittim, ama şimdi görünüşe bakılırsa 'Q.ninvoke()' bir söz verir, böylece geri gönderilebilir. – jfriend00