Как мне использовать итератор `Заголовков` в браузере?

#javascript #typescript #dom #ecmascript-6 #iterator

#javascript #typescript #dom #ecmascript-6 #итератор

Вопрос:

Я пытаюсь использовать Headers итератор в соответствии с документами итератора.

   let done = false
  while ( ! done ) {
    let result = headers.entries()
    if ( result.value ) {
      console.log(`yaay`)
    } 
    if ( result.done ) {
      console.log(`finished`)
      done = true
    } 
  }
 

Я получаю сообщение об ошибке машинописного текста:

 Property 'value' does not exist on type 'IterableIterator<[string, string]>'.
 

Но согласно спецификации, свойство value должно существовать в любом итераторе, и headers.entries() возвращает итератор.

Как мне получить значения из объекта Headers?

Комментарии:

1. done и value являются ли свойства объекта, возвращаемые из next() .

2. @tkausl ах, вот и все — вы хотите добавить это в качестве ответа, и я приму?

Ответ №1:

Но согласно спецификации, свойство value должно существовать на любом Iterator

Нет, он существует в объекте результата итератора, который Iterator .next() возвращает метод. Итак, вы бы сделали

 const iter = headers.entries();
let { value, done } = iter.next();
while (!done) {
    console.log('yay', value);
    ({ value, done } = iter.next());
}
console.log('finished');
 

Однако вы никогда не внедрили бы протокол итерации самостоятельно. Вы просто используете for … of :

 for (const value of headers.entries()) {
    console.log('yay', value);
}
console.log('finished');
 

Ответ №2:

Вы можете использовать Array.from(headers) и использовать обычные методы map / forEach для манипулирования.

 const headers= new Headers({some: 'thing'})

Array.from(headers).forEach(([key,val])=>{console.log(key,val)})