首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Fluture:将未来转换为快速全局错误处理的承诺

Fluture:将未来转换为快速全局错误处理的承诺
EN

Stack Overflow用户
提问于 2021-03-07 21:19:17
回答 1查看 256关注 0票数 1

我试图找到一种方法来将承诺转换为未来--使用流程库来实现函数编程,使用函数管道转换数据,然后将其转换回承诺,这样我就可以利用等待/异步功能。这是为一个快递应用程序,我使用全局错误处理,我不知道如何利用全局错误处理端点,如果我捕捉错误在未来的流程流,而不是转换成承诺后,未来的处理是完成。

  1. 我这样想对吗?
  2. 如果是这样的话,在调用encaseP和后续管道代码之后,如何使用下面代码中的允诺实用程序将其转换回承诺呢?
  3. 是否有更好的方法来利用未来的管道,同时仍将错误传递给全局错误处理程序?
  4. 此外,如果我真的转换成一个承诺,这也会让我获得未来的实际价值,如果我利用等待,我认为是这样吗?

很抱歉,如果这是一个糟糕的问题,我是一个新手的函数式编程和流程,并试图让我的鸭子在适当的排列。

代码语言:javascript
复制
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:诺言()期望它的第一个参数是一个有效的未来。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-08 15:33:27

我相信我已经充分回答了这个问题,在Gitter。我将在下面总结我的回应,以供日后参考。

我在您的代码中看到了一些我想要解决的问题:

  1. findData:我建议您已经将它与encaseP一起包装了--越早越好。因此,您将得到(arrayList) => encaseP (Promise.reject) (arrayList),它也可以像encaseP (Promise.reject)那样编写(因为输入参数只是按原样传递)。
  2. total1函数现在可以直接调用findData并返回一个未来。
  3. .pipe (res => res):这一行实际上什么也不做。在这里,您将res,这是一个数组的未来,转换为res,这是完全相同的事情。理解管道只是函数应用程序是很重要的:https://stackoverflow.com/a/59985017/1001417
  4. .pipe (promise (() => {console.log('do nothing')}) (console.log)):当您使用未来时,工作实际上开始,消费返回一个取消函数(或者承诺,在promise (future)的情况下)。你不应该在你的功能中这样做,而应该在它们之外去做。我建议阅读流体导论,特别是“不消费期货”部分。一个指导原则是,您应该只看到在程序的“边缘”调用fork (或promise或任何其他消费函数)。在这种情况下,你不可能把未来传递给一个能理解未来的政党。

在从total1函数中删除最后一行之后,这样就不会消耗未来,而是从函数返回,我们可以在需要的地方使用未来。例如,运行total1函数并将其输出转发给响应的Express中间件如下所示:

代码语言:javascript
复制
app.get ('/total', (req, res, next) => {
  total1 (req.query.arrayList)
  .pipe (fork (next) (result => res.json ({result})))
})

next作为拒绝回调传递给fork将导致Express处理错误。对于您想要使用内部的未来来控制异步的每一条快速路由,都需要这样做。你可以用流-快递拿走一些样板。

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

https://stackoverflow.com/questions/66521526

复制
相关文章

相似问题

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