2017-05-10 33 views
12

Birkaç gün önce böyle bir işlevi: ben bu şekilde sonuç değeri döndürmek gerekirVaatte vaadiniz: Bir değişkeni çocuğun vaatinden döndürmenin doğru yolu nedir? (JS)

function top() { 

    //promise1 
    ParentPromise({ 
    ...some code here... 
    }).then(function() { 


    //promise2 
     ChildPromise({ 
      ..some code here... 
     }).then(function(response) { 
     var result = response.result.items; 

     }); 

}); 

}; 

ve:

var myresult = start(); 

Bunu nasıl yapabilirim? THX

+0

Nasıl 'start'' top' ilişkilidir: bunun işe yaraması için

function top() { ... return ParentPromie; } var myresult = ''; // default value until you have resolved your promise top().then(result => myresult = result); 

Ancak, sözünü çözmek için kodu eklemeniz gerekir? 'Sonuç' için 'ParentPromise' çözümlemek istiyor musunuz? –

+0

bu bir Google API çağrısı. "Sonuç döndür" almanın bir yolu var mı? Bilmiyorum, global bir değişken gibi –

+0

Olası kopyası [Daha önceki sonuçları Promises ile zincirleme ve paylaşma] (http://stackoverflow.com/questions/28714298/how-to-chain-and-share-prior- sonuçlar-ile-sözler) – Erazihel

cevap

7

vaat tanımı tam anlamıyla myresult için result atanamıyor olmasıdır. Ancak, arayan için result için doğrudan doğrulayan bir söz myresult yapabilirsiniz, ancak bunu elde etmek için birçok sözler kullanılmıştır. Temel fikir, yukarıdaki bloğunuzdaki her işlevin içinde, zincirdeki bir sonraki Promise için return olmalıdır. örneğin: Sonunda

function top() { 

    //promise1 
    return ParentPromise({ 
    ...some code here... 
    }).then(function() { 


    //promise2 
     return ChildPromise({ 
      ..some code here... 
     }).then(function(response) { 
     var result = response.result.items; 
     return result; 

     }); 

}); 

}; 

, top() biliyor ya 1, 2, veya 12 zincirleme sözler result almak için kullanıldığını umursamayacak çağıran kodu. Bu sözlerin hiçbirinin başarısız olması durumunda da bir hata geri bildirimi kaydedebilir.

+0

Tamam anlıyorum, şimdi konsolda [object Object] alıyorum. Sonuçları doğru şekilde nasıl yazdırabilirim? –

+0

@ValerioMarzulli Örnek kodunuzun bir konsol.log() olmadığı için nasıl yardım edeceğimi bilmiyorum, bu yüzden sonucu nasıl almayı/kullanmayı planladığınızı bilmiyorum. Ancak, bir örnek şöyle olurdu: 'top(). Sonra (function (sonuç) {console.log (sonuç);)' 'Sormadan önce, hayır, aynı işlev çağrısı sırasında' sonuç 'alamıyorsunuz - bu yüzden Sözler ve geri bildirimler var – Katana314

+0

anladım, zaman ayırdığınız için teşekkür ederiz! –

4

Bu durumun yerel JS sözleriyle çalışıp çalışmadığından emin olamadığından emin değilim, ancak PromiseKit (hızlı .. biliyorum, ama bu işe yarayacak kadar eminim) İkinci sözü döndürmek için kullanılır ve zincirleme böyle:

function top() { 
    //promise1 
    return ParentPromise({ 
    ...some code here... 
    }).then(function() { 
    //promise2 
    return ChildPromise({ 
      ..some code here... 
    }) 
    }).then(function(response) { 
    var result = response.result.items; 

    }); 
} 

top().then(function(){ 
    // all done 
}); 
+0

Evet, JavaScript Promises bu şekilde çalışır. IMHO, seninki en iyi çözüm. – falsarella

-1

Buradaki sorun, eşzamansız kodu eşzamanlı olarak kullanmaya çalıştığınızdır. Eşzamansız kodla çalışırken düşündüğünüz şekli değiştirmeniz gerekecektir.

Bunu çözmenin bir yolu, top() return ParentPromise'a sahip olmak ve sonra bu efsanenin .then() değerini kullanarak myresult değişkenini ayarlamaktır.

var ParentPromise = new Promise(function(resolve) { 
    ... some code... 
    var ChildPromise = new Promise(function(){ 
    ...some code... 
    }).then(function(response){ 
    resolve(response.result.items); 
    }); 
}); 
+0

Bu, çocuk sözünün çözülmeyeceği anlamına gelir, bu yüzden onun daha sonra çağrılmayacağı anlamına gelir, dolayısıyla ebeveyn sözü de çözülmez; Bekleyen 2 sözün bellek sızıntısına. – falsarella