2016-03-19 6 views
2

私は他の動作のうち、有効な構文ではありません発電機の内部でawaitを使用するにはどうすればよいですか?

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

    // yield smth 
    } 
} 

のように、データベースを照会、発電機を持っています。私がawaitの代わりにコールバックまたは約束の解像度を持っていて、ネストされた関数から生成され、ジェネレータ自体ではない場合でも、どちらも不可能です。

どうすればいいですか?ジェネレータ内で非同期操作を使用するにはどうすればよいですか?

データベースが役立つ場合、データベースはMongoで、ドライバはmongodb-async-wrapperです。

+0

いいえ、ES6とES7では 'async'とジェネレータ関数を組み合わせることはできません。 – Bergi

+0

もちろん私はできません。しかし、私の問題を全く解決することは可能でしょうか?私はデータベース依存のジェネレータを作成したいし、データベースからデータを取得することは非同期操作です。私はオプションから外れていますか? –

+0

このようなことを実現する方法には、いくつかのESの提案があります。 https://github.com/kriskowal/gtorをご覧ください。 'await'や' yield'のどちらかを使って自分で手工芸をすることもできますが、あまりにもシンプルでクリーンではないでしょう。 – Bergi

答えて

1

非同期とジェネレータ機能を組み合わせることはできません。それはあなたが最も可能性の高いあなたのケースで発電機を使用してしたく​​ないとだけではなく、非同期機能を持って言った:

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を信じています。 –

関連する問題