gpt4 book ai didi

javascript - 构建自己的调用栈

转载 作者:行者123 更新时间:2023-12-03 23:48:13 28 4
gpt4 key购买 nike

我试图在一个点拦截对我的库的所有调用,并在我的库函数之间共享自定义调用堆栈(数组)。

这是一个 FP 库,其中管道/组合大量函数是一种常见的做法。内置调用堆栈将跟踪所有调用(包含噪音),而我想忽略内部调用,只记录用户对库的调用,并按照我希望在自定义堆栈中手动管理内部调用的跟踪。似乎部分解决方案是 apply陷阱,但不知道从哪里开始。

// Ramda FP library
// Abbreviate input string: 'some input' -> 'S.I'
const app = R.pipe(R.w, R.x, R.y, R.z)
const output = app('some input')

// Sample actual call stack (including internal calls):
// w -> __w0 -> _t2 -> x -> _x1 -> _x2 -> y -> _y -> z -> _z9

// Desired call stack without internal calls (noise)
// x -> y -> z

如果我在我的库中有自己的调用堆栈数据结构,那么可以生成上面示例的以下输出:

pipe:    w      ->      x     ->     y    ->    z
'some input' ['s','i'] ['S','I'] 'S.I'

如果出现错误:

const output = app('')


// desired output
pipe: w -> x -> y -> z
'' [] Error

Error: Array is empty!

总结:我需要实现我自己的虚拟调用堆栈,它很智能,用于向图书馆用户提供有用的数据。考虑到在 FP 库中柯里化(Currying)、部分应用......是常见的用例,这使得问题更难解决。

最佳答案

这样的事情怎么样:

const audit = fnc => (...args) => {
console.log(`Before call`, args);
const result = fnc(...args);
console.log(`Outcome`, result);
return result;
}

const myPipe = (...args) => {
const auditedArgs = map(audit, args);
return pipe(...auditedArgs);
}


export myPipe;

您可以通过运行来检查它是否有效:

myPipe(
split(' '),
map(myPipe(
trim,
head,
toUpper)),
join('.'),
)('some input');

Full example .

基于此,您可以使用错误处理包装所有内容,而不是将内容记录到控制台 - 正如我在我的示例中所做的那样 - 将函数推送到某种堆栈并在失败时返回其状态。

关于javascript - 构建自己的调用栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53678690/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com