Отказ от ответственности: Я знаю, что следует избегать синхронных действий, и обещания и обратные вызовы предпочтительны, но я застрял в написании системы, которая требует небольшой количество обратной совместимости, и нужно написать это для временного промежутка остановки.Как создать синхронную функцию от асинхронной для обратной совместимости
Пишем 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).
Вся помощь с благодарностью получена.
так что вы хотите версию, которая просто возвращает 'boolean' вместо вызова обратного вызова? – Alnitak
извините, вы не можете – vkurchatkin
@Alnitak, в высшей степени, да. Он должен сделать запрос, а при возврате или таймауте, соответственно возвратить логическое значение. Основная проблема, с которой я сталкиваюсь, - это вернуть функцию, поскольку все методы, которые я могу придумать (Интервалы для проверки значения переменной, которая была изменена обратным вызовом, например), возвращают свою собственную функцию, но не родительскую функцию. –