2016-03-19 5 views
2

У меня генератор, который, среди других операций, запросы к базе данных, какКак использовать функцию ожидания внутри генератора?

function* current(db) { 
    while (true) { 
    const latest = await db.collection('messages').findOne({}, { 
     sort: { 
     timestamp: -1 
     } 
    }); 

    // yield smth 
    } 
} 

, который не является допустимым синтаксисом. Если бы у меня было разрешение обратного вызова или обещания вместо await, то выход из вложенной функции, а не самого генератора, также невозможен.

Что делать? Как я могу использовать асинхронную работу внутри генератора?

Если вам помогли, база данных Mongo, а водитель mongodb-async-wrapper.

+0

Нет, вы не можете комбинировать 'async' с функциями генератора в ES6 и ES7. – Bergi

+0

Конечно, я не могу. Но можно ли вообще решить мою проблему? Я хочу создать генератор, зависящий от базы данных, и выборка данных из базы данных - это асинхронная операция. Тогда я из вариантов? –

+0

Есть некоторые предложения ES, скрывающиеся вокруг того, как заставить такие вещи работать. Посмотрите на https://github.com/kriskowal/gtor. Вы сможете самостоятельно обрабатывать вещи, возможно, даже используя «ожидание» или «выход», но я думаю, это будет не слишком просто или чисто. – Bergi

ответ

1

Вы не можете комбинировать async с функцией генератора. Это сказал, что вы, скорее всего, не хотят, чтобы использовать генератор в вашем случае, а просто иметь функцию асинхронной:

async function current(db) { 
    while (true) { 
    const latest = await db.collection('messages').findOne({}, { 
     sort: { 
     timestamp: -1 
     } 
    }); 

    return smth; 
    } 
} 

Генератор будет создан для вас когда async является transpiled.

+0

Я просто хотел указать, что вы могли бы в Вавилоне 5. Бабель 6 не поддерживал это до недавнего времени ... Я считаю, 6.17.0. –

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