Underscore.js油门不工作

目的

图我的代码有什么问题,或者如果underscore.js油门工作,它应该。

背景

我在一个文件中有一个巨大的邮政编码列表,我正在阅读这些代码并粘贴在控制台上。

我试图使用Underscore.js throttle()函数 ,但是我的代码在两次运行后停止(即使我有几十个),其余的值从不打印。

我的代码是在一个非常简单的NodeJS项目。 我创build了一个我正面临的情况的MCVE :

"use strict"; //requiremetns let fs = require('fs'); let readLine = require('readline'); let _ = require('underscore'); //constants const INPUT_FILE = 'dataset.txt'; const RADIX_CONVERSATION = 10; const THROTTLE_DELAY = 500; let init = function() { let lineReader = readLine.createInterface({ input: fs.createReadStream(INPUT_FILE), output: process.stdout, terminal: false }); let throttledRequestFn = _.throttle(requestFn, THROTTLE_DELAY); lineReader.on('line', function(line) { line = line.trim(); if (_.isNaN(parseInt(line, RADIX_CONVERSATION))) { //Do some stuff } else { throttledRequestFn('mahCountry', line); } }); }; let requestFn = function(country, postalCode){ console.log('request for ' + country + ' and postal ' + postalCode + ' done'); return false; }; init(); 

在这里,我首先通过阅读文件,一次一行。 那么如果我正在阅读的是一个数字,我打印一些东西,否则什么也没有。

以下是一个testing文件:

 Vietnam 000000 100000 160000 170000 180000 200000 220000 230000 240000 250000 260000 270000 280000 290000 300000 310000 320000 330000 350000 360000 380000 390000 400000 410000 420000 430000 440000 460000 480000 510000 520000 530000 550000 560000 570000 580000 590000 600000 620000 630000 640000 650000 660000 670000 700000 790000 800000 810000 820000 830000 840000 850000 860000 870000 880000 890000 900000 910000 920000 930000 940000 950000 960000 970000 

我看到它的方式,我的代码应该每秒2个请求,每个之间有500毫秒的延迟。 它应该打印testing文件中的所有代码。 但是,我从来没有看到任何东西超过第二个值! 为什么发生这种情况?

throttlefunction按预期工作。 从文档 :

对速度限制事件有用,速度限制事件发生得比你能跟得上的速度快。

这意味着你的包装函数可能会被调用的次数less于你想要的。

你真正想要的可能是某种队列。 下划线不提供一个,但asynchronous库会: http : //caolan.github.io/async/docs.html#.queue

 let fs = require('fs'); let readLine = require('readline'); let _ = require('async'); // import the async library let async = require('async'); const INPUT_FILE = 'dataset.txt'; const RADIX_CONVERSATION = 10; // create the queue var q = async.queue(function(task, callback) { // make sure the queue task calls the callback only after the THROTTLE_DELAY setTimeout(function () { requestFn(task.country, task.postalCode); callback(); }, THROTTLE_DELAY); }, 1) q.drain = function () { console.log('all items have been processed'); }; let init = function () { let lineReader = readLine.createInterface({ input: fs.createReadStream(INPUT_FILE), output: process.stdout, terminal: false }); lineReader.on('line', function(line) { line = line.trim(); if (_.isNaN(parseInt(line, RADIX_CONVERSATION))) { // Do some stuff } else { // Add the line to the Queue, to be executed later q.push({country: 'mahCountry', postalCode: line}); } }); }; let requestFn = function(country, postalCode){ console.log('request for ' + country + ' and postal ' + postalCode + ' done'); return false; }; init(); 

注意在处理队列中的元素的函数中使用setTimeout 。 这样,你仍然只会每500毫秒提出一个请求,但将保证使所有这些。

Interesting Posts