У меня есть основной поток в моем приложении узла, такой как это:
function main_thread() {
console.log("Starting");
values = get_values(1);
console.log(values);
console.log("I expect to be after the values");
}
Функция get_values
вызывает функцию hgetall
с использованием пакета node_redis . Эта функция обеспечивает обратный вызов, но может быть обещана:
function get_values(customer_id) {
// Uses a callback for result
new Promise(function(resolve, reject) {
redis_client.hgetall(customer_id, function (err, result) {
if (err) console.log(err)
console.log("About to resolve");
resolve(result);
});
})
.then(({result}) => {
console.log(result);
});
}
Это прекрасно работает для цепочки обещаний внутри функции, но не так хорошо в моем основном потоке, так как я не могу дождаться и вернуть значение.
Вот как я это сделаю на ruby, основном языке, который я использую:
def get_values(customer_id)
return @redis_client.hgetall(customer_id)
end
Как создать обещание в многократно используемой функции и заставить главный поток ждать, пока функция не вернет ответ от обещания?
EDIT:
Было высказано предположение, что обещание может быть возвращено с then
в основной цепочке. Однако это все еще означает, что любой код в основном потоке после того, как вызов функции выполняется перед блоком then
.
РЕДАКТИРОВАТЬ 2:
После продолжительного обсуждения с некоторыми друзьями-разработчиками IRL JS похоже, что попытка создать синхронный скрипт противоречит идеалу современного JS. Я собираюсь вернуться к дизайну своего приложения и работать над его асинхронностью.