Tag: 函数式编程

如何使用node.lift-ed函数when.map?

我正在学习使用when.js库的承诺,并使用带有节点fs.readFile让我觉得我错过了一些东西。 当作为一个单独的promise被调用时, foo promise可以正常工作,但是在when.map作为映射器函数使用时会失败,因为index被注入为第三个参数(然后callback被传递为第四个参数)。 API doc说when.map对mapper函数有两个参数要求。 然后,mapper函数可以写成bar ,它可以在任何情况下工作。 var when = require('when'); var node = require('when/node'); var _ = require('lodash'); // readFile has the same signature as fs.loadFile function readFile(param1, param2, callback) { console.log(Array.prototype.slice.call(arguments)); callback(null, [param1, param2]); } var foo = _.partialRight(node.lift(readFile), 'base64'); var bar = function (fileName, index) { return node.lift(readFile)(fileName, 'base64'); }; when.map(['1', […]

有这个function的标准function名称?

我确定这个函数可能是普遍的(或者可能可以通过其他方式实现),但是我不确定它会被调用什么。 我正在考虑一个特定大小的滑动窗口: let slidingMap = (arr,size, f) => { r = [] arr.reduce((acc, n) => { let b = acc.concat(n); if(b.length > size) { b.shift(); } if(b.length == size) { r.push(f(b)) } return b; },[]) return r; } 所以给出slidingMap([1,2,3,4,5,6], 2, b => b) 你会得到[ [ 1, 2 ], [ 2, 3 ], [ 3, 4 […]

从asynchronous方法返回数据的服务

我正在使用Sails的ORM(水线)。 我已经写了一个geturl服务,应该返回我的应用程序中的几个模型/动作的url。 我目前在我的模板中调用这个服务。 (正如我独自开发这个,如果这种devise模式是错误的,请不要犹豫提醒我) 现在Waterline的.find()方法是asynchronous的(它应该)。 在数据库中插入或提取事物时,我总是使用callback函数来执行操作。 现在我已经看到无处不在 ,我不能从asynchronous方法返回任何数据。 因此我感到困惑,因为我想创build这个[该死的]服务来集中URLpipe理。 这是我现在的代码: module.exports = { variete: function(id_objet) { var string = '/default_url'; return onvariete(id_objet, function (err, url) { if (err) { sails.log.error('Error : ', err); } else { return url; } }); } }; function onvariete(id_objet, next) { var url = '/'; return Variete.findOne({id:id_objet}).exec(function (err, v) { […]

下划线组sorting

我有一个关于函数式编程的问题。 我使用underscore.js库。 让我们考虑一些用例。 我有一些重复标签的数组,我需要计算每个标签在数组中的出现次数,并根据出现次数进行sorting。 为了计算,我可以使用countBy多less个标签 _.countBy([1, 2, 3, 4, 5], function(num) { return num % 2 == 0 ? 'even': 'odd'; }); => {odd: 3, even: 2} 但在这里,因为我有一个散列,这对订单没有意义,所以没有sorting。 所以在这里,我需要将散列转换为数组然后对其进行sorting并将其转换为散列。 我很确定有这样一个优雅的方式,但我没有意识到这一点。 我将不胜感激任何帮助。

如何添加字段的JavaScript数组中的每个对象没有循环?

有没有方法来添加一个字段的每个对象的Javascript数组没有循环呢? 就像是 array.each(function (index, object){ object[newField] = anotherArray[index]; });

在javascript中使用callback之后解释输出

我是新来的JavaScript,我想了解callback。 我无法理解20为什么会在10之前打印出来。我的理解是对于一个callback函数,例如func1(parameter,func2()) , func2()是callback函数, func1执行“参数“传给func1 。 我的理解是正确的吗? function timePass(length){ console.log("finished after doing timePass for "+length +" seconds") } timePass(10,timePass(20)); 以下输出: 完成时间通过20秒后完成 完成时间通过10秒后完成

Monadic IO与ramda和ramda幻想

试图找出IO monad是如何工作的。 使用下面的代码,我读取filenames.txt并使用结果来重命名目录testfiles中的文件。 这显然是未完成的,所以而不是实际重命名我login到控制台的任何东西。 🙂 我的问题是: 我打电话runIO两次,但它感觉只是应该只调用一次,到底? 我想使用renameIO而不是renaneDirect但无法find正确的语法。 任何其他build议也表示赞赏,我是新来的FP! var R = require('ramda'); var IO = require('ramda-fantasy').IO var fs = require('fs'); const safeReadDirSync = dir => IO(() => fs.readdirSync(dir)); const safeReadFileSync = file => IO(() => fs.readFileSync(file, 'utf-8')); const renameIO = (file, name) => IO(() => console.log('Renaming file ' + file + ' to ' […]

我可以使用setTimeout创build一个廉价的无限循环?

var recurse = function(steps, data, delay) { if(steps == 0) { console.log(data.length) } else { setTimeout(function(){ recurse(steps – 1, data, delay); }, delay); } }; var myData = "abc"; recurse(8000, myData, 1); 这个代码让我感到困扰的是我传递了一个8000次的string。 这是否会导致任何types的内存问题? 另外,如果我用node.js运行这个代码,它立即打印,这不是我所期望的。

过滤和映射在相同的迭代

我有这种简单的情况,我想筛选和映射到相同的值,如下所示: const files = results.filter(function(r){ return r.file; }) .map(function(r){ return r.file; }); 为了节省代码行数,以及提高性能,我正在寻找: const files = results.filterAndMap(function(r){ return r.file; }); 这是否存在,或者我应该自己写点什么? 我在一些地方想要这样的function,以前从来没有打扰过这个function。

什么是事件循环,与使用其他模型有什么不同?

我一直在研究Node.JS,所有的文档和博客都讨论它如何使用事件循环而不是按请求模式。 我有一些混淆理解差异。 我觉得我有80%的理解,但还没有完全得到它。