Node.js Fluture:将未来转换为明确的全局错误处理承诺
我试图找到一种方法,使用fluture库实现函数编程,将承诺转换为未来,使用函数管道转换数据,然后转换回承诺,这样我就可以利用wait/async功能。这是针对express应用程序的,我正在使用全局错误处理,如果我在未来处理流程中捕获错误,而在未来处理完成后不转换为承诺,我不知道如何利用端点的全局错误处理Node.js Fluture:将未来转换为明确的全局错误处理承诺,node.js,async-await,promise,functional-programming,fluture,Node.js,Async Await,Promise,Functional Programming,Fluture,我试图找到一种方法,使用fluture库实现函数编程,将承诺转换为未来,使用函数管道转换数据,然后转换回承诺,这样我就可以利用wait/async功能。这是针对express应用程序的,我正在使用全局错误处理,如果我在未来处理流程中捕获错误,而在未来处理完成后不转换为承诺,我不知道如何利用端点的全局错误处理 我这样想对吗 如果是这样,在调用encaseP和后续管道代码后,如何使用下面代码中的promise实用程序将其转换回promise 是否有更好的方法来利用未来的管道,同时仍然向全局错误处理程
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);
当我运行上面的代码时,我得到以下错误:
内部/modules/cjs/loader.js:992
internalBinding('errors')。triggerUncaughtException(
^
TypeError:promise()希望它的第一个参数将来是有效的。我相信我已经充分回答了这个问题。我将在下面总结我的回答,以供将来参考
我在您的代码中看到了一些我想解决的问题:
findData
:我建议尽早用encaseP
包装它。这样您就可以得到(arrayList)=>encaseP(Promise.reject)(arrayList)
,它也可以像encaseP(Promise.reject)
那样编写(因为输入参数只是按原样传递)total1
函数现在可以直接调用findData
,并返回未来.pipe(res=>res)
:这一行实际上什么都不做。在这里,您可以将res(数组的未来)转换为res(完全相同)。了解pipe只是函数应用程序很重要:.pipe(promise(()=>{console.log('do nothing')})(console.log))
:当您消费未来时,工作实际开始,消费返回一个取消函数(或承诺,在promise(Future)
的情况下)。您不应该在函数内部执行此操作,而应该在函数外部执行此操作。我特别建议您阅读。经验法则是,您应该只看到在“边缘”处调用的fork
(或promise
或任何其他消费函数)在这一点上,你不可能把未来传给一个理解未来的人从
total1
函数中删除最后一行后,未来不会被消耗,而是从函数返回,我们可以在需要的地方消耗未来。例如,运行total1
函数并将其输出转发到响应的Express中间件如下所示:
app.get('/total',(req,res,next)=>{
total1(请求查询数组列表)
.pipe(fork(next)(result=>res.json({result})))
})
将
next
作为拒绝回调传递给fork
会导致Express处理错误。对于每个希望使用内部未来来控制异步的Express路由,这都是必需的。您可以使用它删除一些样板文件。您所说的“将承诺转换为未来”是什么意思?什么是“未来”你在说什么?这不是Javascript的内置结构。你是否使用了一些可以向我们指出的库或方法?通常,人们只会通过将非承诺操作包装在承诺中来承诺它们,然后使用承诺逻辑仅用于控制流和捕获错误。返回并进行验证是非常痛苦的承诺和非承诺异步操作之间的差异,因为这使得排序和错误流非常困难。如果将所有非承诺内容包装在承诺中,则可以对所有内容使用承诺控制流和错误处理。我认为实用工具encaseP将承诺返回函数转换为未来返回函数?下面是encaseP description.。我可能说得不正确。我只是回应你写问题的事实,假设每个人都确切知道你在使用什么库,以及你所说的未来是什么意思。这些不是Javascript中的标准内容,所以最好在问题中添加一些关于你使用什么库的上下文使用它,以及你想用它完成什么,这与你通常用承诺所能做的是不同的。就我而言,我从来没有听说过encaseP()
之前,您的问题不包含来自哪里的上下文。您能在express req/res上下文中显示用法吗?您可以直接转到response,而不是插入承诺。我认为您希望从未来返回承诺。