Jquery 在异步javascript调用中设置变量

Jquery 在异步javascript调用中设置变量,jquery,asynchronous-javascript,Jquery,Asynchronous Javascript,我有一个x类C的对象。属性x.myval应该通过调用x.load()来设置,这反过来应该从异步ajax调用获取其数据 C类{ 构造函数(){ this.myval=“你好”; } 加载(){ 返回$.ajax({ 键入:“获取”, url:“file.txt”, //抑制“firefox中的xml格式不正确错误”, 发送前:函数(xhr){ if(xhr.overrideMimeType){xhr.overrideMimeType(“text/plain”);} }, contentType:“

我有一个
x
C
的对象。属性
x.myval
应该通过调用
x.load()
来设置,这反过来应该从异步ajax调用获取其数据

C类{
构造函数(){
this.myval=“你好”;
}
加载(){
返回$.ajax({
键入:“获取”,
url:“file.txt”,
//抑制“firefox中的xml格式不正确错误”,
发送前:函数(xhr){
if(xhr.overrideMimeType){xhr.overrideMimeType(“text/plain”);}
},
contentType:“文本/普通”,
数据类型:“文本”,
成功:函数(文本){
this.myval=文本;
}
});
}
}
var x=新的C();
$.when(x.load()).done(函数(a1、a2){
console.log(x.text);//应打印file.txt的内容
});
我得到一个错误
this.myval未定义
,显然是因为
this
设置为jquery的
this

我还尝试:

C类{
构造函数(){
this.myval=“你好”;
}
加载(){
var callback=函数callbackClosure(mythis){返回函数(text){
this.myval=文本;
}}(本条);
返回$.ajax({
键入:“获取”,
url:“file.txt”,
//抑制“firefox中的xml格式不正确错误”,
发送前:函数(xhr){
if(xhr.overrideMimeType){xhr.overrideMimeType(“text/plain”);}
},
contentType:“文本/普通”,
数据类型:“文本”,
成功:回调
});
}
}
var x=新的C();
$.when(x.load()).done(函数(a1、a2){
console.log(x.text);//应打印file.txt的内容
});

但是这是一个异常
jQuery.Deferred exception:分配给未声明的变量…
这一行中的实例不在这里:

success: function(text) {
    this.myval = text;
}
您可以在outer方法中创建一个引用实例的temp变量,如下所示:

load() {
    var that = this;
    return $.ajax({
        type: "GET",
        url: "file.txt",
        // suppress "xml not well-formed error in firefox", 
        beforeSend: function(xhr){
            if (xhr.overrideMimeType) { xhr.overrideMimeType("text/plain"); }
        },
        contentType: "text/plain",
        dataType: "text",
        success: function(text) {
            that.myval = text;
        }
    });
}
或者,您可以使用箭头功能:

load() {
    return $.ajax({
        type: "GET",
        url: "file.txt",
        // suppress "xml not well-formed error in firefox", 
        beforeSend: function(xhr){
            if (xhr.overrideMimeType) { xhr.overrideMimeType("text/plain"); }
        },
        contentType: "text/plain",
        dataType: "text",
        success: (text) => {
            this.myval = text;
        }
    });
}

使用箭头功能。他们不必。。。还有更优雅的解决方案。另外,如果将来有重复的(规范的),你也可以投票关闭而不是立即回答吗?这是一个非常普遍的问题。是的,我重新措辞了。箭头功能是一个不错的选择。@Li357它确实非常常见。在这之前一个小时,我回答了完全相同的问题。但很难将此标记为另一个问题的重复。我找不到任何合适的问题。那就不要一直回答。投票以重复的方式结束。@Li357想想像我这样的noobs:我很高兴我得到了一个答案。在我发布这个问题之前,我已经搜索了一个多小时。