Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Sync.Parallel — как различать результаты функции? Например, мне необходимо скачать данные из файла, получить данные из базы и подгрузить данные с удалённого сайта. Я пускаю их паралельно, они возвращаются неизвестно в каком порядке. Но мне нужны все три аргумента. Как определить, какой из аргументов к какому запросу относится? В моём решении можно использовать args.fs, args.db и args.remote.// Ассоциативный вариант
var results = Sync.Parallel(function(callback){
someAsyncFunction(2, 2, callback('foo')); // assign the result to 'foo'
someAsyncFunction(5, 5, callback('bar')); // assign the result to 'bar'
});
console.log(results); // { foo: 4, bar: 10 }
// Future
// Запускаем someAsyncFunction, но не блокируем поток
var foo = someAsyncFunction.future(null, 2, 2);
var bar = someAsyncFunction.future(null, 5, 5);
// А вот теперь, дожидаемся значений от foo и bar
console.log(foo.value, bar.value); // 4 10 - ровно через секунду (не две)
var result = someObject.someFunction.sync(someObject, arg1, arg2)
var result = someObject.someFunction(arg1, arg2)
someObject.someFunction(arg1, arg2, function(err, result){
if (err) return callback(err);
})
// Обычная асинхронная функция, вызывает callback через 1 сек с ошибкой
function someAsyncFunction(callback) {
setTimeout(function(){
callback('something went wrong');
}, 1000)
}
// Вариант 1
// Новый поток
Sync(function(){
try {
// вызываем функцию синхронно, птичка вылетит отсюда
someAsyncFunction.sync();
}
// ловим ошибку. в catch. правда.
catch (e) {
console.log(e); // something went wrong
}
})
// Вариант 2
Sync(function(){
// вызываем функцию синхронно
someAsyncFunction.sync();
// или вот так
throw new Error('something went wrong');
}, function(err){
// Ловим здесь любой exception из текущего потока
console.log(e); // something went wrong
})
function syncFunction() {
//
// внутри очень красивый синхронный код
// отсюда можно throw
// любая ошибка из sync() = throw = попадет в результирующий callback
//
}.async()
syncFunction(function(err){
console.log(err); // вот сюда
})
someAsyncFunction(function(err, result){
if (err) return callback(err); // <-- костыль
})
try {
// костыль? а call, apply, bind - тоже костыли?
var result = someAsyncFunction.sync();
}
catch (e) {
// нет костыля
}
var Sync = require('sync'), fs = require('fs');
Sync(function(){
try {
var file1 = fs.readFile.sync(null, 'file1');
var file2 = fs.readFile.sync(null, 'file2');
var file3 = fs.readFile.sync(null, 'file3');
console.log([file1, file2, file3].map(String).join(''));
}
catch (e) {
console.error(e);
}
})
var Sync = require('sync'), fs = require('fs');
Sync(function(){
try {
var file1 = fs.readFile.future(null, 'file1');
var file2 = fs.readFile.future(null, 'file2');
var file3 = fs.readFile.future(null, 'file3');
console.log([file1.result, file2.result, file3.result].map(String).join(''));
}
catch (e) {
console.error(e);
}
})
var file1 = fs.readFileSync('file1');
var file2 = fs.readFileSync('file2');
var file2 = fs.readFileSync('file3');
console.log(file1+" "+file2+" "+file3);
var fs = require('fs');
var exec = require('child_process').exec;
var Seq = require('seq');
Seq()
.seq(function () {
exec('whoami', this)
})
.par(function (who) {
exec('groups ' + who, this);
})
.par(function (who) {
fs.readFile(__filename, 'ascii', this);
})
.seq(function (groups, src) {
console.log('Groups: ' + groups.trim());
console.log('This file has ' + src.length + ' bytes');
})
;
var fs = require('fs');
var exec = require('child_process').exec;
var Sync = require('sync');
Sync(function(){
var who = exec.sync(null, 'whoami'); // seq
var groups = exec.future(null, 'groups ' + who); // par
var src = fs.readFile.future(null, __filename, 'ascii'); // par
console.log('Groups: ' + groups.result.trim());
console.log('This file has ' + src.result.length + ' bytes');
})
var Sync = require('sync');
var fs = Sync(require('fs'));
var cp = Sync(require('child_process'));
Sync(function(){
var who = cp.exec('whoami'); // seq
var groups = cp.execFuture('groups ' + who); // par
var src = fs.readFileFuture(__filename, 'ascii'); // par
console.log('Groups: ' + groups.result.trim());
console.log('This file has ' + src.result.length + ' bytes');
})
// Sync(fn [,obj])([arg1, arg2, ...])
var source = Sync(fs.readFile, fs)(__filename, 'ascii');
var source = fs.readFile.sync(fs, __filename, 'ascii');
var Sync = require('sync'),
fs = Sync.proxy('fs');
Sync(function(){
var source = fs.readFile(__filename, 'ascii');
})
function readFileByLinesAsync(path, callback) {
var input = fs.createReadStream(path);
var remaining = '';
input.on('data', function(data) {
remaining += data;
var index = remaining.indexOf('\n');
while (index > -1) {
var line = remaining.substring(0, index);
remaining = remaining.substring(index + 1);
callback(line);
index = remaining.indexOf('\n');
}
});
input.on('end', function() {
if (remaining.length > 0) {
callback(remaining);
}
});
}
-----------
readFileByLinesAsync('text', function(data){
//add data to mysql if data.type = foo
});
function readFileByLinesAsync(path, callback) {
var input = fs.createReadStream(path);
var remaining = '';
input.on('data', function(data) {
remaining += data;
var index = remaining.indexOf('\n');
while (index > -1) {
var line = remaining.substring(0, index);
remaining = remaining.substring(index + 1);
callback(line);
index = remaining.indexOf('\n');
}
});
input.on('end', function() {
if (remaining.length > 0) {
callback(remaining);
}
// End
callback(null);
});
}
//----------------
// My sync code
var Sync = require('sync');
Sync(function(){
// My sync code
var future = new Sync.Future();
readFileByLinesAsync('text', function(data) {
// resume
if (data === null) return future();
//add data to mysql if data.type = foo
//...
});
// wait until we read all lines
future.yield();
// do something else..
})
function readFileByLinesSync(path, fn) {
var future = new Sync.Future();
var input = fs.createReadStream(path);
var remaining = '';
input.on('data', function(data) {
remaining += data;
var index = remaining.indexOf('\n');
while (index > -1) {
var line = remaining.substring(0, index);
remaining = remaining.substring(index + 1);
fn(line);
index = remaining.indexOf('\n');
}
});
input.on('end', function() {
if (remaining.length > 0) {
fn(remaining);
}
// End
future();
});
future.yield();
}.async(); // <-- important
//----------------
// My sync code
var Sync = require('sync');
Sync(function(){
// This will block until all lines will be passed
readFileByLinesSync('text', function(data) {
//add data to mysql if data.type = foo
//...
});
// do something else..
})
Sync(function(){
readFileByLinesSync('text1', function(data) {
//...
});
readFileByLinesSync('text2', function(data) {
//...
});
readFileByLinesSync('text3', function(data) {
//...
});
// do somehting else..
})
function readFileByLinesSync(path, fn) {
var input = fs.createReadStream(path);
var remaining = '';
input.on('data', function(data) {
remaining += data;
var index = remaining.indexOf('\n');
while (index > -1) {
fn(remaining.substring(0, index)); // process line
remaining = remaining.substring(index + 1);
index = remaining.indexOf('\n');
}
});
// Yield here
input.once.sync(input, 'end');
// process last line
if (remaining.length > 0) {
fn(remaining);
}
}.async(); // <-- important
node-sync — псевдо-синхронное программирование на nodejs с использованием fibers