2015-07-29 21 views
18

Ben URL'ler bir dizi varsa:Bir dizi URL'yi Promise.all ile nasıl getirebilirim?

var urls = ['1.txt', '2.txt', '3.txt']; // these text files contain "one", "two", "three", respectively. 

Ve şöyle bir nesne oluşturmak istiyorum:

var text = ['one', 'two', 'three']; 

Ben fetch ile bunu öğrenmek çalışıyorum hangi tabiki Promise s değerini döndürür.

ben yapmak denedim Bazı şeyler değil eser:

var promises = urls.map(url => fetch(url)); 
var texts = []; 
Promise.all(promises) 
    .then(results => { 
    results.forEach(result => result.text()).then(t => texts.push(t)) 
    }) 

Bu doğru görünmüyor ve her durumda çalışmıyor - Bir ile bitirmek yok dizi ['bir', 'iki', 'üç'].

Promise.all doğru yaklaşımını burada mı kullanıyorsunuz?

+0

. '.' için '.forEach (…)' veya daha doğrusu '… .text()' dönüş değerinde gerçekten aramayı mı düşündünüz? – Bergi

+0

Nerede/log 'metinlerine bakarsınız ve hala boş olduğunu gözlemler misiniz? – Bergi

cevap

39

Evet, Promise.all doğru yaklaşım olmakla birlikte, (yine yanıtın vücut için vaat olan) onlardan bütün text s almak daha sonra ilk fetch tüm URL'ler istiyor ve eğer gerçekten iki kez gerekir. Yani Geçerli kod çalışmıyor

Promise.all(urls.map(fetch)).then(responses => 
    Promise.all(responses.map(res => res.text()) 
).then(texts => { 
    … 
}) 

yapmak gerekir forEach döner şey (bir dizi ne de bir söz ne) çünkü.

Tabii bunu basitleştirmek ve sağ yerine gelen getirme vaadi sonra her yanıttan vücut alma ile başlar: Bergi en örnekler benim için çalıştı nedense ne ait İçin

Promise.all(urls.map(url => 
    fetch(url).then(resp => resp.text()) 
)).then(texts => { 
    … 
}) 
+3

Soruda hissettiğim bir şeyi adresleme: JavaScript'te nasıl çalıştığını öğrenmek için sonuçları bir dış değişkene "ayıklama" yapamazsınız, ancak benzetim yapmak için benzeticileri veya async/await kullanabilirsiniz. JS'de eşzamansızlık konusunda tam bir kılavuz için [bu yanıt] 'a bakın (http://stackoverflow.com/a/30180679/1348195). –

+0

bu harika görünüyor! ama kafamı saramayacağım :(javascript garip bir dil – yota

12

. Sadece bana boş sonuçlar verirdi. Bazı hata ayıklamadan sonra, sözler, getirme bitmeden önce söz vermiş gibi görünüyor, dolayısıyla boş sonuçlar çıkıyor. Bununla birlikte, Benjamin Gruenbaum'un daha önce bir cevabı vardı, ancak silindi. Metodu , benim için yaptı, bu yüzden burada kopyalayıp yapıştıracağım, başka birisinin burada ilk çözümle ilgili herhangi bir problemle karşılaşması durumunda.

var promises = urls.map(url => fetch(url).then(y => y.text())); 
Promise.all(promises).then(results => { 
    // do something with results. 
}); 
3

Sen map yerine forEach kullanmalıdır:

bir parantez içi hata gibi görünüyor
Promise.all(urls.map(url => fetch(url))) 
.then(resp => Promise.all(resp.map(r => r.text()))) 
.then(result => { 
    // ... 
}); 
İlgili konular