Невозможно преобразовать Future в синхронную структуру данных, так как это должно было бы заблокировать поток. Единственный способ получить результат в будущем - это предоставить обратный вызов.
В следующей строке:
const result = future.fold(Result.Error, Result.Ok).fork(x => x, x => x)
Вы сделали предположение, что возвращаемое значение обратных вызовов, предоставленных вами fork
, будет определять возвращаемое значение всего выражения и, следовательно, будет присвоено константе result
.
Проблема, конечно, состоит в том, что эти обратные вызовы будут называться , в конечном итоге , в некотором более позднем тикке JavaScript, когда будет выполнена асинхронная работа. Это означает, что к моменту запуска одного из обратных вызовов переменная result
уже будет назначена и, вероятно, также прочитана.
Вместо этого fork
возвращает функцию unsubscribe
. Таким образом, фактическое значение, которое вы присвоили result
, это функция unsubscribe
.
Вы можете позвонить, чтобы сигнализировать Будущему, что вас больше не интересует конечный результат, позволяя Будущему очиститься.
Вместо этого вы можете сделать две вещи:
- Не конвертируйте свое будущее в результат, а вместо этого конвертируйте результаты в фьючерсы. Фьючерсы - это надмножества Результата. Они представляют успех и неудачу, а также асинхронность и ввод / вывод. Поскольку ваша программа асинхронна, и вы не можете заблокировать поток в Node, вы, скорее всего, в конечном итоге получите Future в качестве основного типа на краю вашей программы (аналогично тому, как вы в конечном итоге получили функцию
async
в точка входа, когда вы используете Обещания).
Укажите остаток вашей программы внутри функции обратного вызова. Вы уже fold
отредактировали ветвь отклонения в типе Result
, поэтому вы можете безопасно использовать value
от Fluture для обеспечения единственного обратного вызова:
future.fold(Result.Error, Result.Ok).value(result => result.map(...))