Вы можете сделать это только внутри генератор.
function* queryDB(query) {
// Here is synchrous-like code!
var rows = yield db.collection.find(query);
var sum = 0;
// Use the rows synchrously
for (var x of rows) {
sum += x;
}
return sum;
}
var sumPromise = doM(queryDB('query example'));
sumPromise.then(console.log.bind(console));
См demo (я рекомендую играть с этим и увидеть, что она возвращается в разных случаях, и это будет понятно).
И вы не можете сделать:
for (var x of db.collection.find(query))
...
Или:
for (var x of queryDB('some query'))
...
Это будет как:
for (var x of (new Promise(...)))
...
Ваш генератор/обертка будет возвращать a pr omise. Вы можете сделать только then
.
И вы не можете сделать:
function* queryDB(query) {
db.collection.find(query).then(function(values) {
yield values;
});
}
Объяснение последнего:
Как компилятор увидит этот код:
function* queryDB(query) {
db.collection.find(query).then(anonymousFunction);
}
И anonymousFunction
я s не является генератором, поэтому вы не можете написать yield
. Кроме того, Promise
в then
не ожидает генератор.
С другой стороны, если вы хотите использовать for (var x in queryDB())
, компилятор рассчитывает вернуть массив из queryDB()
. Если ваш queryDB()
будет асинхронным, он вернет интерфейс, подобный Promise.
При переключении на более функциональный стиль, вы можете написать:
forEach(queryDB(), function(item) {
// action on item
});
Вы можете сделать reduce
или map
реализации, если вам сейчас, что ваше обещанное значение является массивом. Но в этом случае вам не нужен генератор.
doM
реализация:
function doM(gen) {
function step(value) {
var result = gen.next(value);
if (result.done) {
return result.value;
}
return result.value.then(step);
}
return step();
}
Источник: Monads in JavaScript.
forEach
реализация:
function forEach(promise, callback) {
return promise.then(function(iterable) {
for (var x of iterable) {
callback(x);
}
});
}
[Нет] (http://stackoverflow.com/a/29281361/1048572) – Bergi
'для ... of' синхронно. Синхронно обрабатывать асинхронные методы невозможно. –
... ummm Я не думаю, что вы правильно прочитали мой вопрос ... Я могу * перебрать результат * генератора. –