导入数组中的JavaScript随机项表现异常

时间:2017-10-27 01:43:23

标签: javascript arrays random

以下代码似乎表现得很奇怪。基本上,我正在从文本文件中导入行分隔的句子列表,然后从中创建一个数组。但是当我尝试从数组中选择一个随机句子时,它不起作用,因为sentenceString变得未定义。

然而,当我跑步时 Math.floor(Math.random()*(sentenceArr.length)+ 1); 我得到了一个很好的随机数字。

当我运行sentenceArr.length时 我得到了数字12,这确实是长度。

我错过了什么?

    var sentenceArr = [];

    $.get('sentences.txt', function(data){
        sentenceArr = data.split('\n');
    });

    var rand = Math.floor(Math.random() * (sentenceArr.length) + 1);

    var sentenceString = sentenceArr[rand];

    var sentence = sentenceString.split(' ');

更新: 我按照下面的建议尝试制作一个Promise,但它似乎仍然无法正常工作。我使用Promise的新代码如下所示:

    var sentenceArr = [];
    var done = false;

    function loadSentences() {
        var rand = Math.floor(Math.random() * (sentenceArr.length) + 1);
        var sentenceString = sentenceArr[rand];
        var sentence = sentenceString.split(' ');
    };

    $.get('/sentences.txt', function(data){
        sentenceArr = data.split('\n');
        done = true;
    });     

    var isItDone = new Promise(function(resolve) {
        if(done) {  
            resolve('it worked');
        }   
    });

    //consume the promise:
    var checkIfDone = function() {
        isItDone
            .then(function (fulfilled) {
                loadSentences();        
            })

            .catch(function (error) {
                console.log('oops, it failed');
            });
    };

    checkIfDone();

这似乎总是回归“哎呀,失败了”,仿佛承诺永远不会实现。但是,当我检查“done”的值时,它是“true”,这意味着在继续下一步之前完成了Ajax请求。谁能开导我?我已经阅读了三篇关于promises的教程,似乎无法弄清楚我将错误应用于自己的代码时的错误。谢谢。

2 个答案:

答案 0 :(得分:1)

问题是您在服务器响应完成之前尝试操作文件内容。

查看承诺以了解更多https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

使用jquery ajax api解决问题的方法。

var sentenceArr = [];
var file = 'path/to/file';

$.get(file)
.done(function (data) {
  sentenceArr = data.split('\n');
  var rand = Math.floor(Math.random() * (sentenceArr.length) + 1);
  var sentenceString = sentenceArr[rand];
  var sentence = sentenceString.split(' ');

  console.log(sentenceArr)
  console.log(rand)
  console.log(sentenceString)
  console.log(sentence)
});

答案 1 :(得分:0)

谢谢,我解决了这个问题,首先将一切包装在一个函数中,并使用.then()仅在Ajax" get"之后运行所有内容。完成了:

var sentenceArr = [];

const getData =()=>         $ .get(' http://eslquiz.net/wordmix/sentences.txt',功能(数据){

    })

.then(data => {   // use this format to run function only after json get is done (since it's async)
                  // "data" is the contents of the text file
    sentenceArr = data.split('\n');
    console.log('Made sentence array');

    loadSentences();

});