Жигалов Сергей
Сергей Жигалов
ChellyJS, 2015г
function getUnpaidFines(carNumber, cb) {
getFinesByCarNumber(carNumber, function (err, fines) {
if (err) { cb(err); }
var isUnpaidFines = [];
var finesCounter = fines.length;
fines.forEach(function (fine, index) {
isFineUnpaid(fine, function (err, isUnpaid) {
if (err) { cb(err); }
isUnpaidFines[index] = isUnpaid;
if (--finesCounter === 0) {
var unpaidFines = filterUnpaidFines(fines, isUnpaidFines);
cb(null, unpaidFines);
}
})
});
});
}
function getUnpaidFines(carNumber, cb) {
getFinesByCarNumber(carNumber, function (err, fines) {
if (err) { cb(err); }
var isUnpaidFines = [];
var finesCounter = fines.length;
fines.forEach(function (fine, index) {
isFineUnpaid(fine, function (err, isUnpaid) {
if (err) { cb(err); }
isUnpaidFines[index] = isUnpaid;
if (--finesCounter === 0) {
var unpaidFines = filterUnpaidFines(fines, isUnpaidFines);
cb(null, unpaidFines);
}
})
});
});
}
function getUnpaidFines(Ввести номер автомобиля, cb) {
Получить список штрафов(carNumber, function (err, fines) {
if (err) { cb(err); }
var isUnpaidFines = [];
var finesCounter = fines.length;
fines.forEach(function (fine, index) {
Получить статус оплаты(fine, function (err, isUnpaid) {
if (err) { cb(err); }
isUnpaidFines[index] = isUnpaid;
if (--finesCounter === 0) {
var unpaidFines = Вывести неоплаченные штрафы
cb(null, unpaidFines);
}
})
});
});
}
function myFunction(arg1, arg2, cb) {
cb(err, data);
}
var myPromisifyFunction = Promise.promisify(myFunction);
myPromise()
.then(function onResolve() { return data; })
.then(function onResolve(data) { ... })
.catch(function onReject() { ... })
function getUnpaidFines(carNumber) {
return getFinesByCarNumber(carNumber)
.then(function (fines) {
return Promise.props({
fines: fines,
isUnpaidFines: Promise.all(fines.map(isFineUnpaid))
});
})
.then(function (data) {
return filterUnpaidFines(data.fines, data.isUnpaidFines);
});
}
function getUnpaidFines(Ввести номер автомобиля) {
var fines = Получить список штрафов(carNumber);
var isUnpaidFines = fines.map(Получить статус оплаты);
return Вывести неоплаченные штрафы(fines, isUnpaidFines);
};
function getUnpaidFines(carNumber) {
var fines = getFinesByCarNumber(carNumber);
var isUnpaidFines = fines.map(isFineUnpaid);
return filterUnpaidFines(fines, isUnpaidFines);
}
function getUnpaidFines(carNumber) {
var fines = yield getFinesByCarNumber(carNumber);
var isUnpaidFines = yield fines.map(isFineUnpaid);
return filterUnpaidFines(fines, isUnpaidFines);
}
function *getUnpaidFines(carNumber) {
var fines = yield getFinesByCarNumber(carNumber);
var isUnpaidFines = yield fines.map(isFineUnpaid);
return filterUnpaidFines(fines, isUnpaidFines);
}
co(function *getUnpaidFines(carNumber) {
var fines = yield getFinesByCarNumber(carNumber);
var isUnpaidFines = yield fines.map(isFineUnpaid);
return filterUnpaidFines(fines, isUnpaidFines);
})
.then(console.log.bind(console))
.catch(console.error.bind(console));
A generator can pause itself in mid-execution, and can be resumed either right away or at a later time.
ES6 ES2015
function *foo(name) {
console.log('Hello, ' + name);
}
function *foo(name) {
console.log('Hello, ' + name);
}
foo('ChellyJS');
>
An iterator is a structured pattern for pulling information from a source in one-at-a-time fashion.
it.next()
> { value: {...}, done: false}
function *foo(name) {
console.log('Hello, ' + name);
}
var it = foo('ChellyJS');
it.next();
> Hello, ChellyJS
function *foo() {
console.log('1');
yield;
console.log('2');
}
var it = foo();
it.next();
// Do somethings...
it.next();
>
> 1
>
> 2
function *foo() {
yield 'Some data';
}
var it = foo();
console.log(it.next());
console.log(it.next());
> {value: "Some data", done: false}
> {value: undefined, done: true}
function *order() {
yield 'Цезарь';
yield 'Окрошка';
yield 'Шоколадный кексик с мороженкой';
yield 'Компотик';
}
var it = order(); // Подходит официант
it.next(); // " - Что будете заказывать?"
function *order() {
yield 'Цезарь';
yield 'Окрошка';
yield 'Шоколадный кексик с мороженкой';
yield 'Компотик';
}
var it = order(); // Подходит официант
it.next(); // " - Что будете заказывать?"
it.next(); // " - Хорошо"
function *order() {
yield 'Цезарь';
yield 'Окрошка';
yield 'Шоколадный кексик с мороженкой';
yield 'Компотик';
}
var it = order(); // Подходит официант
it.next(); // " - Что будете заказывать?"
it.next(); // " - Хорошо"
it.next(); // " - Что нибудь еще?"
function *order() {
yield 'Цезарь';
yield 'Окрошка';
yield 'Шоколадный кексик с мороженкой';
yield 'Компотик';
}
var it = order(); // Подходит официант
it.next(); // " - Что будете заказывать?"
it.next(); // " - Хорошо"
it.next(); // " - Что нибудь еще?"
it.next(); // " - Пить что будете?"
function *order() {
yield 'Цезарь';
yield 'Окрошка';
yield 'Шоколадный кексик с мороженкой';
yield 'Компотик';
}
var it = order(); // Подходит официант
it.next(); // " - Что будете заказывать?"
it.next(); // " - Хорошо"
it.next(); // " - Что нибудь еще?"
it.next(); // " - Пить что будете?"
it.next(); // " - Все"
co(function *getUnpaidFines(carNumber) {
var fines = yield getFinesByCarNumber(carNumber);
var isUnpaidFines = yield fines.map(isFineUnpaid);
return filterUnpaidFines(fines, isUnpaidFines);
})
.then(console.log.bind(console))
.catch(console.error.bind(console));
Generator based control flow goodness for nodejs and the browser, using promises, letting you write non-blocking code in a nice-ish way.https://github.com/tj/co
co(function* () {
var value = yield Promise.resolve(true);
return value;
}).then(function (value) {
console.log(value); // true
});