2013-11-11 3 views
0

Я реализует API, который имеет функцию:Node функция обертка расслоение плотной асинхронной

get(url) 

который возвращает объект Response, то есть не обратного вызова. Http-модули, которые я нашел, реализуют асинхронные функции узла с обратными вызовами. Я попытался дождаться, когда функция async вернется несколькими способами, используя Fibers и т. Д. Волокна решают проблему внутри Fiber, но не могут использоваться в моем случае, поскольку мне нужно вернуть значение вне любого Fiber.

Возможно, возможно завернуть полное выполнение (включая код с использованием API), но я действительно этого не хочу. Есть ли какой-нибудь модуль, который делает то, что я хочу?

+1

Вы не можете использовать асинхронный результат в качестве возвращаемого значения из функции без оживленного взлома. Ваш метод 'get' API должен использовать параметр обратного вызова или возвращать обещание. – JohnnyHK

+0

Я действительно не могу сделать это как Im, реализующий API. Существующий код ожидает, что эта функция будет синхронной. Не могли бы вы расширить «занятый ожидающий взлом»? – prinsen

+1

Почему вы используете узел, если вам запрещено использовать асинхронный рабочий процесс? – robertklep

ответ

0

Если я понимаю вопрос, что вы пытаетесь смешивать асинхронный код с синхронным кодом, то то, что вы пытаетесь выполнить, на самом деле невозможно без обещаний. Как только вы смешиваете асинхронный код с синхронным кодом, вы делаете весь код асинхронным или вы рискуете, что синхронный код вернет значение до того, как будет возвращен результат от синхронного кода.

Вы всегда можете попробовать тайм-аут функции, которая удерживает ее, до тех пор, пока не истечет заданный период времени, который надеется, что асинхронный код выполнит и имеет возвращаемое значение до того, как возвращается синхронный код. Однако это крайне неэффективно и не устраняет проблему, поскольку вы все равно можете вернуться до завершения асинхронной части.

Я также согласен с комментарием от robertklep, что node.js действительно не подходит для вашего варианта использования, и вам может быть лучше посмотреть на другой инструмент для работы.

+0

Поскольку Im управляет областью применения API, мне удалось обернуть его в волокно, позволяя использовать run и yield внутри функций API. – prinsen

Смежные вопросы