2015-01-09 1 views
5

Я немного об этом подумал, и я не могу найти разумного решения о том, как это сделать. Оператор проблемы прост - напишите генератор, который будет лениво разбивать удаленный набор данных. Чтобы упростить вещи, это в идеале я хотел бы для пользователя моей библиотеки увидеть:Правильное использование с генераторами ES6 и разбиением на страницы

for (var user of users()) { 
    console.log(user); 
} 

Я не совсем, кажется, чтобы получить генератор работать. Я думал, что логика так будет работать, но я не могу понять, как ее реализовать.

function* users() { 
    while (canPaginate) { 
    yield* getNextPageOfUsers() // This will need to return an array of users from an http request 
    } 
} 

Я уверен, что я думаю о чем-то здесь не так, но я не могу найти ни одного примера, кто использует генератор, как это (в основном люди, использующие их статические данные или люди делают что-то как async(function*(){...}), что не совсем то, что я ищу). Важная часть здесь заключается в том, что я хочу, чтобы конечный пользователь мог использовать данные, как описано выше.

-Vince

+0

Я рекомендую уточнить вопрос. В комментарии к моему удаленному ответу вы сказали: «Моя проблема не в потреблении, это реализация генератора, который потребляет асинхронные данные» * Я не верю, что вы * можете * реализовать генератор как асинхронный : Когда вы вызываете генератор, он должен возвращать следующий элемент или ничего, и поэтому не может вернуть значение async так же, как обычные функции не могут вернуть значение async. –

+0

Возможно с помощью генератора асинхронных функций - теперь они находятся в спецификации. –

+0

Боковое примечание: проблема с кодом потребления также определенно: она перебирает одну страницу пользователей. Для циклического перехода по нескольким страницам вам понадобится вложенный цикл (один для страниц, один для пользователей на этой странице). –

ответ

5

Генераторы функции, которые, в сущности, пауза и дают обратно в их абонентов. Но при вызове они должны синхронно либо вернуть значение, либо завершить. Поэтому они не могут вернуть результат асинхронной операции по той же причине, что обычные функции не могут вернуть результат асинхронной операции.

Как указал Бенджамин, есть предложение ES7 для asynchronous generators, которое позволит им это сделать, но это ES7, и это заметно в будущем на этом этапе. Синтаксис потребления также затронут (понятно, важно, чтобы люди, пишущие вызов, знали, когда что-то идет асинхронно, мы не можем, чтобы обычные функции выглядели синхронно, когда они не являются).

Согласно действующему предложению, ваш код используется асинхронными генераторами будет выглядеть примерно так:

for (var user on users()) { 
    console.log(user); 
} 

(. Обратите внимание на on вместо in или of) Но это может измениться.

+1

Спасибо! У меня было чувство, что я не мог заставить это работать! Спасибо за великолепное объяснение. – vincentjames501

 Смежные вопросы

  • Нет связанных вопросов^_^