Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 30.10.2015, 04:11
Аспирант
Отправить личное сообщение для livelover Посмотреть профиль Найти все сообщения от livelover
 
Регистрация: 17.01.2014
Сообщений: 39

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

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

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


вижу вот такую штуку https://www.versioneye.com/nodejs/syncwrap/0.0.10
но что всё-таки лучше юзать и как вообще это понимать?
Спасибо!
Ответить с цитированием
  #2 (permalink)  
Старый 30.10.2015, 11:46
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

https://developer.mozilla.org/en-US/...and_Generators
__________________
Цитата:
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
Ответить с цитированием
  #3 (permalink)  
Старый 10.11.2015, 07:58
Аватар для freeneutron
Аспирант
Отправить личное сообщение для freeneutron Посмотреть профиль Найти все сообщения от freeneutron
 
Регистрация: 23.05.2012
Сообщений: 40

Я использую такую обертку для асинхронной функции 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);
	}
})
Ответить с цитированием
  #4 (permalink)  
Старый 10.11.2015, 12:37
Аспирант
Посмотреть профиль Найти все сообщения от pnpquest
 
Регистрация: 09.11.2015
Сообщений: 94

cyber,
Генераторы сами по себе не обеспечивают синхронизацию. Там в основе лежат промисы, генераторы тут вторичны. Можно делать синхронизацию одними промисами, без генераторов, но не наоборот.
Ответить с цитированием
  #5 (permalink)  
Старый 10.11.2015, 12:45
Интересующийся
Отправить личное сообщение для nick1m Посмотреть профиль Найти все сообщения от nick1m
 
Регистрация: 31.10.2015
Сообщений: 29

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

new Promise(function (resolve, reject) {
  fs.readFile('myfile.txt', function (err, file) {
    if (err) {
      return reject(err);
    }
    resolve(file);
  });
}).then(/* ... */)
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск