我正在尝试使用JavaScript中更实用的样式; 因此,我已经用for实用函数替换了for循环,例如map和reduce.但是,我没有找到while循环的功能替换,因为尾调用优化通常不适用于JavaScript.(根据我的理解,ES6可以防止尾调用溢出堆栈,但不会优化它们的性能.)
我解释了我在下面尝试过的内容,但TLDR是:如果我没有尾调用优化,那么实现while循环的功能方法是什么?
我尝试过的:
创建"while"实用程序功能:
function while(func, test, data) {
const newData = func(data);
if(test(newData)) {
return newData;
} else {
return while(func, test, newData);
}
}
Run Code Online (Sandbox Code Playgroud)
由于尾调用优化不可用,我可以将其重写为:
function while(func, test, data) {
let newData = *copy the data somehow*
while(test(newData)) {
newData = func(newData);
}
return newData;
}
Run Code Online (Sandbox Code Playgroud)
但是在这一点上,感觉就像我让我的代码更复杂/混淆使用它的任何人,因为我必须使用自定义实用程序功能.我看到的唯一实际优势是它迫使我使循环变得纯净; 但似乎只是使用常规while循环并确保我保持一切纯净是更直接的.
我还试图找出一种方法来创建一个模拟递归/循环效果的生成器函数,然后使用像find或reduce这样的实用函数迭代它.但是,我还没有想出一种可读的方法.
最后,用实用函数替换for循环使得我想要完成的更明显(例如,对每个元素做一件事,检查每个元素是否通过了测试等).然而,在我看来,while循环已经表达了我想要完成的事情(例如,迭代直到我们找到素数,迭代直到答案得到充分优化,等等).
所有这一切之后,我的整体问题是:如果我需要一个while循环,我正在以函数式编程,而且我无法访问尾调用优化,那么什么是最佳策略.
javascript recursion functional-programming while-loop tail-call-optimization
我正在开发一个更高阶的组件,它将提供使用 MediaRecorder API 捕获媒体的能力。但是,当我尝试使用捕获的视频(以传递给 createObjectURL 的 Blob 形式)时,我收到错误ERR_REQUEST_RANGE_NOT_SATISFIABLE。当我通过控制台记录传递给包装组件的 Blob 时,它的长度为 0。我已在本文末尾添加了我的代码。
为了诊断问题,我尝试了以下测试:
handleDataAvailable记录正确的值(即[Blob])。React.useEffect(() => console.log(chunks), [chunks]);为了查看块是否实际上正在更新。这也会导致记录正确的值(即[Blob])。React.useEffect(() => console.log(captured), [captured]);为了查看捕获是否正在更新。这会导致记录大小为 0 的 Blob。handleStop,我控制台日志块以及通过组合这些块创建的 blob。这会分别产生一个空数组和一个大小为 0 的 blob。这让我相信正确地将每个块添加到块数组中,但不知何故该数组在运行handleDataAvailable时被清空。handleStop
有谁知道是什么原因导致这种情况发生?
代码:
import React from 'react';
import { getUserMedia, getConstraints } from '../../utils/general';
const withMediaCapture = (WrappedComponent, recordingType, facingMode, deviceID) => {
const constraints = getConstraints(recordingType, facingMode, deviceID);
const type = …Run Code Online (Sandbox Code Playgroud) reactjs web-mediarecorder mediastream mediarecorder-api react-hooks
我试图通过使用 Lodash/FP 清理一些旧代码来了解更多关于在函数式编程中使用柯里化和组合的知识。但是,我反复遇到我有一个函数并且我想传递一个或多个函数的情况。然后我想将将用作参数的值传递给我传递给原始函数的函数。
我发现很难准确解释我想要做什么,所以我制作了一个 JS Fiddle,展示了我是如何尝试解决这个问题的:https : //jsfiddle.net/harimau777/rqkLf1rg/2/
const foo = a => `${a}${a}`
// Desired Behavior: const ans1 = (a, b) => `${foo(a)}${foo(b)}`
const ans1 = _.compose(
(a, b) => `${a}${b}`,
foo,
foo
)
// Desired Result: '1122'
console.log(ans1('1', '2'))
// Desired Behavior: const ans2 = a => a.map(a => a + 1)
const ans2 = _.compose(
_.map,
a => a + 1
)
//Desired Result: [2, 3, 4]
console.log(ans2([1, 2, 3]))
Run Code Online (Sandbox Code Playgroud)
根据下面 Ori Drori 的回答,我认为我可以澄清我的问题(这是人们通常如何跟进 StackOverflow 而不是提出新问题?):假设不是将相同的函数序列应用于我想要的两个输入将一系列函数应用于第一个输入,将不同的序列应用于第二个输入,并将两个结果用作 …
javascript ×2
currying ×1
lodash ×1
mediastream ×1
react-hooks ×1
reactjs ×1
recursion ×1
while-loop ×1