2016-08-30 12 views
6

Ben redux tepki docs aracılığıyla vaat için ara katman yaklaşık öğrenmeye çalışıyorum ancak aşağıda then bölümünü anlamıyorum:Tepki redux'u, middleware'in sonuçta ortaya çıkan eylemi nasıl gönderdiğine dair vaadini nasıl veriyor?

const vanillaPromise = store => next => action => { 
    if (typeof action.then !== 'function') { 
    return next(action) 
    } 

    return Promise.resolve(action).then(store.dispatch) 
} 

Nasıl then ne gönderme biliyor? Eylem,

gibi bir argüman olarak geçmedi, bu yüzden gönderimin işlemi nasıl aldığını anlamıyorum.

cevap

4

Umarım bu açıklamada yardımcı olabilirim.

return Promise.resolve(action) 
    .then(function (action) { store.dispatch(action)}) 

Bu bölümü görmek:

aşina ne bakalım

"eylem" özelliği geçirilecek bekleyen sadece bir fonksiyondur
function (action) { store.dispatch(action)} 

.

return Promise.resolve(action) 
    .then(store.dispatch) // <--- this part 

"gönderme" sadece bir işlev olduğunu ve bu durumda, bir argüman, bekliyor: Biz etrafında beyin sarma sorun yaşıyorsanız şeye baktığımızda

Şimdi, bu. Büyük olasılıkla, bir nesne - şöyle: Gerçekten ihtiyacımız yok,

.then((action) => { 
    store.dispatch(action) 
}) 

ama: şimdi

store.dispatch({ type: 'MY_ACTION_TYPE' })} 

, bunu gibi bir kapatma sarın "olabilir", ve tanıdık gelecektir anonim bir işlevle "sarmak" için? Gerçekten değil, bu yüzden biz sadece koyabilirsiniz: store.dispatch, ve sözün geri dönüşünden argümanı geçecek "beklemek" işlevidir. Bu gibi düşünmeye:

biz fonksiyonunu incelemek "MultipleByTwo" zaman - tanıdık imza bildiğine göre sahiptir hakkında: (x) => x * 2

biz ise

Promise.resolve(5).then((x) => x * 2) 

Not: sadece kendi aynı şey, fonksiyon adını kaldırmak Sen çözmek (5) görüyoruz -> bir zincir, ya da bir "atlatma" gibi resolve.then düşünüyorum. "(5) 'i çözdüğümüzde" 5 "değerini" .then "' e geçiriyoruz. Şimdi hatırlayın, 5 değer bir şey olabilir ... bir ilkel, bu durumda 5, bir nesne {TYPE: "WHATEVER"}, bir fonksiyon vs. .. sadece ellerim .. gibi, "Hey" .then ', İşte benim değer (myFunction '.. onlar TÜM bekliyoruz geçer argüman üzerinde veya bizim multiplyByTwo, hatta o store.dispatch örneği bu örnek "

resolve(5).then(myfunction) 
     |    ^
     |__>__>__>__>__>_| 

o anlamak önemlidir' .... olduğunu s).

multiplyByTwo(x) <-- expecting one argument 

veya fonksiyon işlev imza dahilinde beyan olmayabilir AMA olacak vücut ala iç ..

myFunction() { 
    const args = Array.from(arguments) // we grab the arguments 
} 

veya bağımsız değişkenler

myOtherFunction(...args) 

Ama evet herhangi bir sayı için umut - bu fonksiyonlar hareket etmeye çözünürlük bazı giriş bekliyoruz. Eğer iade değeri hakkında umurumda değil, eğer varsa, sadece bazı akış kontrol sahip olmak istiyorum ... Bunu yapmak, "BU SONRA" ..

Umarız bu yardımcı oldu ve umarım soruyu cevapladım. Değilse, haberim olsun.

+0

Teşekkür ederim, çalışmanın kapanmasını gerektirmediğini görebiliyorum. ama bu ne işe yarıyor? Belirli bir argümanın parametre olarak beyan edilmeden iletildiğini söyleyen javascript kuralı nedir? Bu, şu şeylerin mi? Sihirli olarak çağrılan nesnenin çözümlenmiş değerini alır ve onu geri çağırır mı? – stackjlei

+0

Evet, ".then" in nasıl çalıştığını açıklayan cevabımı güncellememe izin verin. –

İlgili konular