我试图找到一种方法来将承诺转换为未来--使用流程库来实现函数编程,使用函数管道转换数据,然后将其转换回承诺,这样我就可以利用等待/异步功能。这是为一个快递应用程序,我使用全局错误处理,我不知道如何利用全局错误处理端点,如果我捕捉错误在未来的流程流,而不是转换成承诺后,未来的处理是完成。
很抱歉,如果这是一个糟糕的问题,我是一个新手的函数式编程和流程,并试图让我的鸭子在适当的排列。
const arrayList = [];
arrayList.push({
a: {
b: 1,
c: 2,
d: 3
}
},{
a: {
b: 2,
c: 3,
d: 3
}
})
const findData = (arrayList) => Promise.reject(null)
let total1 = (list) => encaseP(findData)(list)
.pipe(res => res)
.pipe(map(x => x.map(y => ({
a: {
b: y.a.b + 1,
c: y.a.c + 1,
d: y.a.d + 1
}
}))))
.pipe(promise (() => {console.log('do nothing')}) (console.log));
console.log(total1);
total1(arrayList);当我运行上面的代码时,我会得到以下错误:
内部/模块/cjs/loader.js:992 internalBinding('errors').triggerUncaughtException( ^
TypeError:诺言()期望它的第一个参数是一个有效的未来。
发布于 2021-03-08 15:33:27
我相信我已经充分回答了这个问题,在Gitter。我将在下面总结我的回应,以供日后参考。
我在您的代码中看到了一些我想要解决的问题:
findData:我建议您已经将它与encaseP一起包装了--越早越好。因此,您将得到(arrayList) => encaseP (Promise.reject) (arrayList),它也可以像encaseP (Promise.reject)那样编写(因为输入参数只是按原样传递)。total1函数现在可以直接调用findData并返回一个未来。.pipe (res => res):这一行实际上什么也不做。在这里,您将res,这是一个数组的未来,转换为res,这是完全相同的事情。理解管道只是函数应用程序是很重要的:https://stackoverflow.com/a/59985017/1001417.pipe (promise (() => {console.log('do nothing')}) (console.log)):当您使用未来时,工作实际上开始,消费返回一个取消函数(或者承诺,在promise (future)的情况下)。你不应该在你的功能中这样做,而应该在它们之外去做。我建议阅读流体导论,特别是“不消费期货”部分。一个指导原则是,您应该只看到在程序的“边缘”调用fork (或promise或任何其他消费函数)。在这种情况下,你不可能把未来传递给一个能理解未来的政党。在从total1函数中删除最后一行之后,这样就不会消耗未来,而是从函数返回,我们可以在需要的地方使用未来。例如,运行total1函数并将其输出转发给响应的Express中间件如下所示:
app.get ('/total', (req, res, next) => {
total1 (req.query.arrayList)
.pipe (fork (next) (result => res.json ({result})))
})将next作为拒绝回调传递给fork将导致Express处理错误。对于您想要使用内部的未来来控制异步的每一条快速路由,都需要这样做。你可以用流-快递拿走一些样板。
https://stackoverflow.com/questions/66521526
复制相似问题