首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将未来转变为民间故事的结果

将未来转变为民间故事的结果
EN

Stack Overflow用户
提问于 2018-05-16 11:15:10
回答 2查看 351关注 0票数 3

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

代码语言:javascript
复制
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时抛出错误

代码语言:javascript
复制
TypeError: result.map is not a function
EN

回答 2

Stack Overflow用户

发布于 2018-07-19 20:48:11

fork执行未来,并期望您在fork参数中提供的回调中处理结果,更重要的是返回cancel函数,而不是您期望的对其结果应用.map的next Future

将代码更改为:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-07-25 19:16:14

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

在以下行中:

代码语言:javascript
复制
const result = future.fold(Result.Error, Result.Ok).fork(x => x, x => x)

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

当然,问题是,当异步工作完成时,这些回调最终将在稍后的JavaScript节拍中被调用。这意味着当其中一个回调函数运行时,result变量已经被赋值很久了,并且可能也被读取了。

相反,fork返回一个unsubscribe函数。因此,您分配给result的实际值是unsubscribe函数。

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

你可以做两件事来代替:

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50361976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档