Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   синхронная обёртка над асинхронной функцией (https://javascript.ru/forum/node-js-io-js/59157-sinkhronnaya-objortka-nad-asinkhronnojj-funkciejj.html)

livelover 30.10.2015 04:11

синхронная обёртка над асинхронной функцией
 
в основном nodejs исповедует callback'и, но иногда хочется писать плоско.
var result = f();

Как лучше оборачивать функцию, которая результат передаёт в свой аргумент-callback?

чтобы вместо
f(function (res) {...my code});
писать
var res = syncWrap(f);


вижу вот такую штуку https://www.versioneye.com/nodejs/syncwrap/0.0.10
но что всё-таки лучше юзать и как вообще это понимать?
Спасибо!

cyber 30.10.2015 11:46

https://developer.mozilla.org/en-US/...and_Generators

freeneutron 10.11.2015 07:58

Я использую такую обертку для асинхронной функции request:
function url_get(url){
	return request.sync(null,{url: url})[1]
}

данная функция возвращает тело результата http-запроса. Значение параметров null и [1] можно найти в документации по request и sync
единственное условие налагаемое на данную обертку в том, что ее можно вызывать только внутри фибера - особой асинхронной функции, то есть вот так:
sync(function(){
	. . .
	var body= url_get(url)
	. . .
})

есть так же одно неудобство, заключающееся в том, что ошибки возникшие внутри фибера не попадают в консоль. Я решаю данную проблему так:
sync(function(){
	try{
		. . .
		var body= url_get(url)
		. . .
	}catch(e){
		console.error(e);
	}
})

pnpquest 10.11.2015 12:37

cyber,
Генераторы сами по себе не обеспечивают синхронизацию. Там в основе лежат промисы, генераторы тут вторичны. Можно делать синхронизацию одними промисами, без генераторов, но не наоборот.

nick1m 10.11.2015 12:45

Пример обёртки в промисы:

new Promise(function (resolve, reject) {
  fs.readFile('myfile.txt', function (err, file) {
    if (err) {
      return reject(err);
    }
    resolve(file);
  });
}).then(/* ... */)


Часовой пояс GMT +3, время: 19:13.