我没有找到更好的题目。其实,这个问题更多的是关于范围的问题吧。但我会试着解释我的问题。我在这里和那里遇到过这样的例子,一个reduce方法做了嵌套函数,引用了以前的累加器和当前的值,那就是几步前的值。但这是我看到的方式,虽然我完全不确定。所以我才来这里澄清我的理论。我试着重读了关于reduce,composition和scope的文章,但是所有的文章似乎都没有在类似的场景下使用。也许我毕竟只是不善于上网查资料。让我们考虑一个 例子:
const composePromises = (...ms) =>
ms.reduce((f, g) => x => g(x).then(f));
const g = n => Promise.resolve(n + 1);
const f = n => Promise.resolve(n * 2);
const z = n => Promise.resolve(n * 1.2);
const h = composePromises(z, f, g);
h(20);
所以问题是:是否 x => g(x).then(f)
进场 then
有固定 f: n => Promise.resolve(n * 1.2)
和 g: n => Promise.resolve(n * 2)
. 然后在调用 h(20)
当 g = n => Promise.resolve(n + 1)
解决了 then
轮到生产的时候,它解决了 x => g(x).then(f)
有固定 f
和 g
到我之前提到的功能?
我已经尽量描述得很详细了,希望你能明白我的意思。我只是想了解这种应用是如何工作的。我花了点时间去理解引用是如何改变成的。f
和 g
以正确的方式。这是我想到的唯一一个解释。
这里是一个简化的替换评估。我只关注lambda (f, g) => x => g(x).then(f)
而省去 reduce
-机械厂。我还改变了一些名称(acc
意思是累加器,但仍然是一个函数)。)
const composePromises = (...ms) =>
ms.reduce((acc, f) => x => f(x).then(acc));
const myg = n => Promise.resolve(n + 1);
const myf = n => Promise.resolve(n * 2);
const myz = n => Promise.resolve(n * 1.2);
// first reduction step:
(acc, f) => x => f(x).then(acc); // apply acc with myz and f with myf
// intermediate result:
const acc_ = x => (n => Promise.resolve(n * 2)) (x).then(n => Promise.resolve(n * 1.2));
// second reduction step:
(acc, f) => x => f(x).then(acc); // apply acc with acc_ and f with myg
// final result:
const foo =
x => (n => Promise.resolve(n + 1)) (x)
.then(x =>
(n => Promise.resolve(n * 2)) (x)
.then(n => Promise.resolve(n * 1.2)));
你可以在控制台中运行最终结果,它将产生预期的结果。希望对你有所帮助。