синхронная обёртка над асинхронной функцией
в основном nodejs исповедует callback'и, но иногда хочется писать плоско.
var result = f(); Как лучше оборачивать функцию, которая результат передаёт в свой аргумент-callback? чтобы вместо f(function (res) {...my code}); писать var res = syncWrap(f); вижу вот такую штуку https://www.versioneye.com/nodejs/syncwrap/0.0.10 но что всё-таки лучше юзать и как вообще это понимать? Спасибо! |
|
Я использую такую обертку для асинхронной функции 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);
}
})
|
cyber,
Генераторы сами по себе не обеспечивают синхронизацию. Там в основе лежат промисы, генераторы тут вторичны. Можно делать синхронизацию одними промисами, без генераторов, но не наоборот. |
Пример обёртки в промисы:
new Promise(function (resolve, reject) {
fs.readFile('myfile.txt', function (err, file) {
if (err) {
return reject(err);
}
resolve(file);
});
}).then(/* ... */)
|
| Часовой пояс GMT +3, время: 02:29. |