Изменения

ECMAScript и все-все-все

1365 байтов добавлено, 17:25, 10 октября 2016
Нет описания правки
b.throw(new Error("x")); // передаст исключение внутрь генератора. и вернёт { value: "error", done: false}
b.next(); // вернёт { value: "final", done: true }
</source>
 
==== Чем генераторы круты? @@ ====
 
{{mag|Они дают убрать лестницу колбэков!}} Пример лестницы (node-postgres):
 
<source language="javascript">
const pg = require('pg');
function makeQueries(callback)
{
var client = new pg.Client();
client.connect(function(err) {
if (err) throw err;
client.query('SELECT $1::text as name', ['brianc'], function (err, result) {
if (err) throw err;
client.end(function (err) {
if (err) throw err;
callback(result);
});
});
});
}
makeQueries(function(result) { console.log(result.rows[0]); });
</source>
 
==== А теперь с генераторами @@ ====
 
Генератор можно приостановить. Пишем обёртку и получаем coroutine:
 
<source language="javascript">
const gen = require('gen-thread');
const pg = require('pg');
 
function* makeQueries()
{
var client = new pg.Client();
// yield подождёт, пока не выполнится автоматически созданный колбэк gen.ef()
yield client.connect(gen.ef());
var result = (yield client.query('SELECT $1::text as name', ['brianc'], gen.ef()))[0];
yield client.end(gen.ef());
return result;
}
 
gen.run(makeQueries(), function(result) { console.log(result.rows[0]); });
</source>