如何停止运行代码,直到$ .get返回值?

时间:2019-05-26 18:32:54

标签: javascript jquery ajax

我正在尝试从文件中读取数据,并使用jquery的get函数将其保存到数组中。但是,由于get函数是异步的,因此$ .get函数调用之后的代码将运行,并且数据未定义。仅在调用完成并返回数据之后,如何才能在$ .get函数调用之后运行代码?

我尝试将async设置为false,但是控制台日志给出了不推荐使用的错误。

    class CharacterDatabase{
      constructor(fName){
        this.fileText = readFile(fName);
        this.fileText = this.fileText.split(/[\r\n]+/);
      }
    }

    function readFile(fName){
      console.log(fName);
      $.get(fName, function(data){
        return data;
      }, "text");
    }

    var cd = new CharacterDatabase("text.txt");

错误:

main.js:32 Uncaught TypeError: Cannot read property 'split' of undefined at new CharacterDatabase (main.js:32) at main.js:85

被抛出到控制台中。

第32行是:

this.fileText = this.fileText.split(/[\r\n]+/); 

将async设置为false时,错误状态表明不赞成使用同步XMLHTTPRequest。

1 个答案:

答案 0 :(得分:0)

一个简单的解决方案是将呼叫包装在Promise中并使用async/await

class CharacterDatabase{
  constructor(fName){
    this.init();
  }
}

async function init() {
    this.fileText = await readFile(fName);
    this.fileText = this.fileText.split(/[\r\n]+/);
}

async function readFile(fName){
  console.log(fName);
  await new Promise((resolve) => {$.get(fName, function(data){
    resolve(data);
  }, "text")});;
}

var cd = new CharacterDatabase("text.txt");

作为附带说明,我通常不建议在构造函数中放置任何I / O操作。