我有以下示例代码来获取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发布于 2018-07-19 20:48:11
fork执行未来,并期望您在fork参数中提供的回调中处理结果,更重要的是返回cancel函数,而不是您期望的对其结果应用.map的next Future。
将代码更改为:
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发布于 2018-07-25 19:16:14
将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清理。
你可以做两件事来代替:
async函数。您已经将rejection分支fold到了Result类型中,所以您可以安全地使用Fluture中的value来提供单个回调:future.fold(Result.Error,Result.Ok).value(result =>
https://stackoverflow.com/questions/50361976
复制相似问题