有没有办法在node.js中创建延迟?

时间:2019-02-23 08:36:01

标签: javascript node.js

基本上,我有一个table文件正在从中删除所有元音,除非它不包含辅音。新单词将附加到新的3000.txt文件中。 但是,有些单词完全丢失,而另一些单词则缺少一些辅音。我怀疑这是由于脚本添加到文件的速度过快。 因此,我想插入20 ms或任何合适的延迟时间。这只是一个家庭游戏脚本,我不在乎它是否有效。

TMP.txt

3 个答案:

答案 0 :(得分:2)

我不确定延迟是否会起作用,但是我注意到您在循环中使用appendFile,也许您应该使用字符串代替,并在完成后调用一次appendFile。 否则,我建议使用appendFileSync或等待appendFile。 抱歉,这是我的代码示例。

var fs = require("fs");
var words = fs.readFileSync("3000.txt").toString();
words = words.split("\n");

var vowels = /[aeiouy]/;
var consonants = /[bcdfghjklmnpqrstvxz]/;
var TMPword = "";

let str = '';

for(var testword of words) 
{
    if(testword.match(vowels))
    {
        if(testword.match(consonants))
        {
            TMPword = testword.replace(/a|e|i|o|u|y/g,'')
            str += TMPword;
        }
        continue;
    }

    //Delay goes here//
}
fs.appendFile("TMP.txt", str, function (err, file) {if(err) throw err;} );

fs.appendFileSync("TMP.txt", TMPword);

await fs.appendFile("TMP.txt", TMPword, function (err, file) {if(err) throw err;} ); // function must be with async

答案 1 :(得分:2)

您需要等到appendFile回调被调用后才能继续下一个调用。有几种方法可以做到这一点,但是这个异步循环应该可以解决问题:

var fs = require("fs");
var words = fs.readFileSync("3000.txt").toString();
words = words.split("\n");

var vowels = /[aeiouy]/;
var consonants = /[bcdfghjklmnpqrstvxz]/;

function loop(words) {
    if (!words.length) return; // All done
    var word = words.shift().replace(/a|e|i|o|u|y/g, '');
    fs.appendFile("TMP.txt", word, function (err, file) {
        if(err) throw err;
        loop(words); // Only process next after completing this one
    });
}
// Only retain words that pass the conditions:
words = words.filter(testword => testword.match(vowels) && testword.match(consonants));
// Start asynchronous loop
loop(words);

答案 2 :(得分:1)

也许setTimeout可以在这里帮助您?

setTimeout(function(){ console.log('foo'); }, 3000);

1000毫秒= 1秒;

或ES6语法

setTimeout( ()=> console.log('foo'), 3000 )