Как сделать только одну выборку для всех URL-адресов, читаемых из api [duplicate]

int valInt = 12;
Console.WriteLine(valInt.ToString("X"));  // C  ~ possibly single-digit output 
Console.WriteLine(valInt.ToString("X2")); // 0C ~ always double-digit output
25
задан Bergi 26 October 2015 в 21:44
поделиться

3 ответа

Да, Promise.all - правильный подход, но вам действительно нужно его дважды, если вы хотите сначала fetch указать все URL-адреса, а затем получить все text s от них (что опять-таки является обещанием для тела ответа ). Поэтому вам нужно будет

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

. Ваш текущий код не работает, потому что forEach ничего не возвращает (ни массив, ни обещание).

Конечно, вы можете упростить это и начать с получения тела от каждого ответа сразу после выполнения соответствующего обещания выборки:

Promise.all(urls.map(url =>
    fetch(url).then(resp => resp.text())
)).then(texts => {
    …
})
53
ответ дан Bergi 19 August 2018 в 02:52
поделиться
  • 1
    Обращаясь к чему-то, что я почувствовал в вопросе: вы не можете «извлечь». приводит к внешней переменной из-за того, как async работает в JavaScript, но вы можете использовать генераторы или async / await для имитации. См. этот ответ для полного руководства по асинхронности в JS. – Benjamin Gruenbaum 29 July 2015 в 21:49
  • 2
    это выглядит потрясающе! но я не могу обернуть голову :( javascript - странный язык – yota 23 August 2017 в 07:14
  • 3
    Для меня второй вариант return fetch(url) ... – sansSpoon 24 April 2018 в 09:50
  • 4
    @sansSpoon Вы уверены, что использовали сжатое тело стрелки, которое у меня есть в моем ответе? Он делает неявным образом возвращает обещание. – Bergi 24 April 2018 в 10:38
  • 5
    Дох, конечно, ладонь & gt; лицо. Я всегда смешиваю свои es5 / 6. Благодарю. – sansSpoon 24 April 2018 в 11:07

Вместо forEach вы должны использовать map:

Promise.all(urls.map(url => fetch(url)))
.then(resp => Promise.all( resp.map(r => r.text()) ))
.then(result => {
    // ...
});
4
ответ дан evgenAborigen 19 August 2018 в 02:52
поделиться
  • 1
    зачем использовать карту вместо forEach? просто спросить? – Christian Matthew 17 July 2018 в 15:27
  • 2
    @ChristianMatthew map возвращает каждый результат fetch(url), а forEach ничего не возвращает. См. Либо принятый ответ, либо stackoverflow.com/a/34426481/1639983 . – Holden Lewis 25 July 2018 в 21:46
  • 3
    спасибо @HoldenLewis, это ответ, о котором я думал – Christian Matthew 26 July 2018 в 18:36

По какой-то причине ни один из примеров Берги не работал для меня. Это просто даст мне пустые результаты. После некоторой отладки кажется, что обещание вернется до того, как результат будет завершен, следовательно, будут пустые результаты.

Однако Бенджамин Груэнбаум ответил здесь ранее, но удалил его. Его метод сделал для меня , поэтому я просто скопирую его здесь, в качестве альтернативы, если кто-то еще столкнется с какими-либо проблемами с первым решением здесь.

var promises = urls.map(url => fetch(url).then(y => y.text()));
Promise.all(promises).then(results => {
    // do something with results.
});
14
ответ дан peirix 19 August 2018 в 02:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: