2015-01-26 3 views
0

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

Пишем express.js приложения, у меня есть функция, которая принимает объект запроса от .get или .POST и т.д. функции, и подтверждает, является ли ключ сеанса (после проверки этого с удаленным сервером API) , Основная версия функции такова:

module.exports.isValidSession(req, cb) { 
    // REST API Calls and callbacks, error handling etc, all works fine. 
} 

мне нужна версия выше, чтобы быть совместимым с более старой системой (которая в скором времени будет прекращено). Я новичок в Node, хотя и не в JS, поэтому мне интересно, есть ли хорошая конвенция о том, как это сделать?

Дополнительная информация

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

function isValidSession(req) { 

    var running = 1, ret = -1; 

    var looper = setInterval(function() { 

     if (!running) { 
      clearInterval(looper); 
      return ret; // This is the problem bit. Returns an async interval function, not the parent. 
     } 

    }, 500); 

    request(requestOpts, function (error, response, body) { 

     if (error) { 
      ret = new Error('Some error went on'); 
      running = -1; 
     } 

     if (response.statusCode === 200) { 
      ret = true; 
      running = -1; 
     } 

    }); 

} 

вполне может оказаться невозможным, или, скорее всего, не жизнеспособны, но было бы очень полезно, если бы я может включать это для обратной совместимости в течение недели или около того. Это проект dev, так что, если это не очень хорошая практика, это будет делать, пока это не все. Однако я понимаю, что это в основном противоречит целям узла (хотя сам узел включает в себя несколько функций, доступных как в версиях sync, так и в async).

Вся помощь с благодарностью получена.

+0

так что вы хотите версию, которая просто возвращает 'boolean' вместо вызова обратного вызова? – Alnitak

+1

извините, вы не можете – vkurchatkin

+0

@Alnitak, в высшей степени, да. Он должен сделать запрос, а при возврате или таймауте, соответственно возвратить логическое значение. Основная проблема, с которой я сталкиваюсь, - это вернуть функцию, поскольку все методы, которые я могу придумать (Интервалы для проверки значения переменной, которая была изменена обратным вызовом, например), возвращают свою собственную функцию, но не родительскую функцию. –

ответ

0

Делает вид, что есть веская причина, по которой автор этого желает.

Существует довольно популярны (так, что вы не одиноки) модуль, который называется synchronize.js

использования:

  1. Добавить обратный вызов к вашему isValidSession

    function isValidSession(req, cb) { 
    
    request(requestOpts, function (error, response, body) { 
    
        if (error) { 
         cb(new Error('Some error went on')); 
        } 
    
        if (response.statusCode === 200) { 
         cb(null, true); 
        } 
    }); 
    
    } 
    
  2. Используйте его с sync модуль:

    var ret = sync.await(isValidSession(req, sync.defer()))

P.S. Может потребоваться тестирование, см. documentation.

+0

Спасибо, был на самом деле в процессе написания моего собственного ответа в этом направлении, но у него есть надпись. Я не буду притворяться, что мои рассуждения о желании этого особенно актуальны, и это, конечно же, не то, что происходит на производственном сайте! –

+0

требует, чтобы весь ваш код выполнялся внутри волокна – vkurchatkin

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