2017-04-18 11 views
13

bir Axios Promise dönersek, ancak then()/catch() yöntemi değil uygulandıktan sonra dönen?bir Axios sözünü dönen ileri zincirleme sağlayan neden birinin lütfen açıklayabilir fonksiyonu

Örnek:

const url = 'https://58f58f38c9deb71200ceece2.mockapi.io/Mapss' 
 
    
 
function createRequest1() { 
 
    const request = axios.get(url) 
 

 
    request 
 
    .then(result => console.log('(1) Inside result:', result)) 
 
    .catch(error => console.error('(1) Inside error:', error)) 
 

 
    return request 
 
} 
 

 
function createRequest2() { 
 
    const request = axios.get(url) 
 

 
    return request 
 
    .then(result => console.log('(2) Inside result:', result)) 
 
    .catch(error => console.error('(2) Inside error:', error)) 
 
} 
 

 
createRequest1() 
 
.then(result => console.log('(1) Outside result:', result)) 
 
.catch(error => console.error('(1) Outside error:', error)) 
 

 
createRequest2() 
 
.then(result => console.log('(2) Outside result:', result)) 
 
.catch(error => console.error('(2) Outside error:', error))
<script src="https://unpkg.com/[email protected]/dist/axios.min.js"></script>

https://jsfiddle.net/nandastone/81zdvodv/1/

O Promise yöntemleri zincirleme edilecek bir değer döndürmesi gerekir ama neden bu iki dönüş yöntemleri arasında bir fark var mı?

+0

ikinci örnek, ilk örnek gerçek bir konudur –

+2

söz request' 'döndüren zincirin "son" döndürür, sen' şey dönen değil .o/.catch' - hangi –

+2

üzgünüm, benim hata undefined', onlar 'çağıran console.log' sonucunu dönüyor' üzere çözülecek bir Promise'in sonuçları - 'undefined' olan (- bir örtmece değil ben keman peeked) –

cevap

21

İlk örnek orijinal sözünü verir. Kişisel İkinci örnek bir farklı sözünü, catch arayarak yarattığı birini verir. İkinci örnekte

  1. , sen çözünürlük değerine geçen değiliz, bu nedenle then tarafından döndürülen vaat ait undefined (dönüş değeri ile çözümlenir: ikisi arasındaki

    kritik farklar console.log).

  2. İkinci örneğinizde, undefined (console.log sonucunu catch sonucundan döndürerek) reddedişlere dönüştürüyorsunuz. Reddedilen bir söz vermeyen veya iade etmeyen bir catch işleyicisi, reddedişi bir çözüme dönüştürür.

Söz zincirleriyle ilgili önemli noktalardan biri, sonuçları dönüştürmeleridir; Her çağrı then veya catch yeni bir söz oluşturur ve onların işleyicileri, sonuçların içinden geçtikçe aşağı akışta gönderilenleri değiştirebilir.

olağan model gerçekten zincirin sonucu geri olacaktır, ancak zincirin fonksiyonlar için ya kasten sonucu transforme veya geçmek. Normalde, hata koşulunu düzeltmek için kullanmıyorsanız (reddetmeyi bir çözünürlüğe dönüştürmek için), zincirin terminal ucunun dışında bir catch işleyicisine sahip olmazsınız. Sadece hala arayanlar onu görmek için izin verirken geçirilen neyi giriş yapmak istedim ama herhangi bir nedenle zincirin sonucunu dönmek istiyorum yaptıysak

, bunu yapardım:

return request 
    .then(result => { console.log(result); return result; }) 
    .catch(error => { console.error(error); return Promise.reject(error); }); 

veya throw kullanarak:

return request 
    .then(result => { console.log(result); return result; }) 
    .catch(error => { console.error(error); throw error; }); 
+5

Teşekkürler @TJ, açıklamanız kesinlikle vaatlerin daha detaylı olarak anlaşılmasına yardımcı oldu. Bunu takdir ediyorum. –