【问题标题】:Convert Fluture Future to folktale Result将 Fluture Future 转换为民间故事结果
【发布时间】:2018-10-25 23:34:45
【问题描述】:

我有以下示例代码来获取 uuid:

const Result = require('folktale/result')
const Future = require('fluture')

Future.prototype.flatMap = Future.prototype.chain

const fetch = Future.encaseP(require('node-fetch'))
const message = err => `ERROR: ${err.message}`

function getUuid () {
  return fetch('https://httpbin.org/uuid')
}

const future = getUuid()
  .map(response => {
    const responseJson = response.json.bind(response)
    const getResponseBody = Future.encaseP(responseJson)
    return getResponseBody()
  })
  .map(obj => obj.uuid)

const result = future.fold(Result.Error, Result.Ok).fork(x => x, x => x)
console.log(result) // [Function: Sequence$cancel]
result.map(
  x => {
    return message(x)
  },
  x => {
    console.log(x)
    return x
  }
)

结果不是可映射类型,当我调用result.map时抛出错误:

TypeError: result.map is not a function

【问题讨论】:

  • 不知道future,但您可能需要等待future 承诺先解决

标签: javascript node.js folktale fluture


【解决方案1】:

fork 执行future 并期望您处理在fork 参数中提供的回调结果,更重要的是返回cancel 函数,而不是下一个Future,因为您期望我在其上应用.map结果。

将代码改为:

const cancelToken = future
    .fold(Result.Error, Result.Ok)
    // if you wanna map result, do it here:
    // .map(...)
    .fork( // fork consumes the fluture and ends execution chain
        ok => message(x), 
        err => { console.log(err); }
    );
// call cancelToken() if you want to cancel it

【讨论】:

    【解决方案2】:

    不可能将 Future 转换为同步数据结构,因为它必须阻塞线程。获得 Future 结果的唯一方法是提供回调。

    在下面一行:

    const result = future.fold(Result.Error, Result.Ok).fork(x => x, x => x)
    

    您假设您提供给fork 的回调的返回值将决定整个表达式的返回值,因此被分配给result 常量。

    当然,问题是这些回调将在异步工作完成后在稍后的 JavaScript 滴答声中最终被调用。这意味着在其中一个回调运行时,result 变量将早已被分配并且可能还会被读取。

    相反,fork 返回一个 unsubscribe 函数。所以你分配给result 的实际值是unsubscribe 函数。

    您可以调用它来向 Future 发出信号,表明您不再对最终结果感兴趣,从而让 Future 进行清理。


    你可以做两件事:

    1. 不要将 Future 转换为 Result,而是将 Results 转换为 Future。期货是结果的超集。它们代表成功和失败,以及异步和 I/O。由于您的程序是异步的,并且您不能阻塞 Node 中的线程,因此您很可能最终会在程序的边缘将 Future 作为您的主要类型(类似于您最终在使用 Promises 时的入口点)。
    2. 在回调中提供程序的其余部分。您已经将拒绝分支 folded 到 Result 类型中,因此您可以安全地使用 Fluture 中的 value 来提供单个回调:

      future.fold(Result.Error, Result.Ok).value(result => result.map(...))
      

    【讨论】:

      猜你喜欢
      • 2023-03-25
      • 2021-12-28
      • 1970-01-01
      • 2018-12-19
      • 2017-01-27
      • 2015-07-30
      • 2016-05-04
      • 2015-09-20
      • 2019-10-25
      相关资源
      最近更新 更多