Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Fluture:将未来转换为明确的全局错误处理承诺_Node.js_Async Await_Promise_Functional Programming_Fluture - Fatal编程技术网

Node.js Fluture:将未来转换为明确的全局错误处理承诺

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 是否有更好的方法来利用未来的管道,同时仍然向全局错误处理程

我试图找到一种方法,使用fluture库实现函数编程,将承诺转换为未来,使用函数管道转换数据,然后转换回承诺,这样我就可以利用wait/async功能。这是针对express应用程序的,我正在使用全局错误处理,如果我在未来处理流程中捕获错误,而在未来处理完成后不转换为承诺,我不知道如何利用端点的全局错误处理

  • 我这样想对吗
  • 如果是这样,在调用encaseP和后续管道代码后,如何使用下面代码中的promise实用程序将其转换回promise
  • 是否有更好的方法来利用未来的管道,同时仍然向全局错误处理程序获取错误
  • 此外,如果我真的转换为承诺,那么如果我使用wait,我认为这也会让我获得未来的实际价值吗
  • 抱歉,如果这是一个糟糕的问题,我是函数式编程和fluture的新手,我正在努力让我的鸭子在正确的路线

    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,而不是插入承诺。我认为您希望从未来返回承诺。