2016-03-19 16 views
2

Ich habe einen Generator, der unter anderen Operationen, eine Datenbank abfragt, wieWie benutze ich in einem Generator warten?

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

    // yield smth 
    } 
} 

, die nicht gültige Syntax ist. Wenn ich anstelle von await eine Callback- oder Verspre- chen-Resolution hätte, ist das Ergeben einer verschachtelten Funktion und nicht des Generators selbst ebenfalls nicht möglich.

Was soll ich dann tun? Wie kann ich den asynchronen Betrieb in einem Generator verwenden?

Wenn es hilft, ist die Datenbank Mongo, und der Fahrer ist mongodb-async-wrapper.

+0

Nein, kann man nicht mit Generator-Funktionen in ES6 und ES7 kombinieren 'async'. – Bergi

+0

Natürlich kann ich nicht. Aber ist es möglich, mein Problem überhaupt zu lösen? Ich möchte einen datenbankabhängigen Generator erstellen, und das Abrufen von Daten aus einer Datenbank ist ein asynchroner Vorgang. Habe ich dann keine Optionen mehr? –

+0

Es gibt einige ES-Vorschläge, die darüber lauern, wie man solche Dinge zum Laufen bringen kann. Sehen Sie sich https://github.com/kriskowal/gtor an. Du wirst in der Lage sein, dich in Handarbeit zu machen, vielleicht sogar mit "erwarten" oder "Ausbeute", aber ich denke, es wird nicht zu einfach oder sauber sein. – Bergi

Antwort

1

Sie können nicht async mit einer Generatorfunktion kombinieren. Das heißt Sie wahrscheinlich nicht wollen, einen Generator in Ihrem Fall zu verwenden und stattdessen nur eine Asynchron-Funktion haben:

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

    return smth; 
    } 
} 

Der Generator wird für Sie erzeugt werden, wenn die async transpiled wird.

+0

Ich wollte nur darauf hinweisen, dass du in Babel 5. Babel 6 das bis vor kurzem nicht unterstützen könntest ... ich glaube 6.17.0. –