来自导入数组的JavaScript随机项行为异常

来自导入数组的JavaScript随机项行为异常,javascript,arrays,random,Javascript,Arrays,Random,以下代码的行为似乎很奇怪。基本上,我从一个文本文件中导入一系列行分隔的句子,然后将它们组成一个数组。但是当我尝试从数组中选择一个随机句子时,它不起作用,因为sentenceString没有定义 然而,当我跑的时候 数学地板(数学随机()*(句子长度)+1); 我得到了一个很好的随机数 当我跑完句子的长度 我得到了数字12,这确实是长度 我错过了什么 var sentenceArr = []; $.get('sentences.txt', function(data){

以下代码的行为似乎很奇怪。基本上,我从一个文本文件中导入一系列行分隔的句子,然后将它们组成一个数组。但是当我尝试从数组中选择一个随机句子时,它不起作用,因为sentenceString没有定义

然而,当我跑的时候 数学地板(数学随机()*(句子长度)+1); 我得到了一个很好的随机数

当我跑完句子的长度 我得到了数字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的新代码如下所示:

    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请求在进入下一步之前已经完成。有谁能启发我吗?我已经阅读了三篇关于承诺的教程,但似乎无法找出将这个概念应用到我自己的代码中的错误。谢谢。

问题是您试图在服务器响应完成之前处理文件内容

看看承诺,了解更多

以及使用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)
});

谢谢,我解决了这个问题,首先将所有内容包装到一个函数中,然后使用.then()在Ajax“get”完成后运行所有内容:

var sentenceArr = [];
常量getData=()=> $.get(“”,函数(数据){


}))

生成的随机数是多少?它在0-11范围内吗?谢谢,我试过你的代码,但仍然返回“未定义”的句子。我也读了一些关于承诺的书(感谢你的链接),并且做出了这样一个承诺:
    })

.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();