以下代码似乎表现得很奇怪。基本上,我正在从文本文件中导入行分隔的句子列表,然后从中创建一个数组。但是当我尝试从数组中选择一个随机句子时,它不起作用,因为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的教程,似乎无法弄清楚我将错误应用于自己的代码时的错误。谢谢。
答案 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();
});