Javascript 在Ajax回调中访问'this',所有这些都在一个对象中

Javascript 在Ajax回调中访问'this',所有这些都在一个对象中,javascript,jquery,ajax,object,Javascript,Jquery,Ajax,Object,我正在处理一个关于对象内部Ajax回调的问题。 请考虑此代码: Search.prototype = { ask : function( query ) { // Display loader $('.loader').show(); $.ajax({ dataType : 'jsonp', type : 'GET', url : 'http://api.de

我正在处理一个关于对象内部Ajax回调的问题。 请考虑此代码:

Search.prototype =
{
    ask : function( query )
    {
        // Display loader
        $('.loader').show();

        $.ajax({
            dataType : 'jsonp',
            type : 'GET',
            url : 'http://api.deezer.com/search/track/',
            data : {
                output : 'jsonp',
                q : query
            }
        }).done(function(res) {

            this.loadResults( res );
            // [Error] Object success has no method 'loadResult'

        });
    },

    loadResults : function (res)
    {
        // Hide loader
        $('.loader').hide();

        console.log( res );

        // doing some stuff
        // ...
    }
}

var search = new Search();
search.ask( 'eminem' );
我得到一个错误
objectsuccess没有方法loadResult
,这很有意义,因为回调是匿名jQuery函数的一部分

但是如何获得我的初始对象实例呢

我一直在尝试使用一个var=this;在Ajax调用之前,但出于同样的原因,我不会工作

我不知道是否可以这样做,或者问题是否来自我的代码全球组织。请随时就最佳实践向我提供建议:)

提前谢谢

[更新(已解决)] 我在我的代码中混淆了一些东西,我认为没有必要在这里发布这些东西,但我最终在代码的早些时候发现了这个问题。 很抱歉

这是我的完整代码,现在正在运行:

define(['jquery'], function($) {

    var Search = function()
    {
        this._keyDownTimer = 0;
        this._searchDelay = 1000; // ms
    };

    Search.prototype =
    {
        // The init function that I though it was unnecessary to post here. Sorry :/
        init : function()
        {
            $('#q').on('keydown', (function(evt) {

                clearTimeout( this._keyDownTimer );

                this._keyDownTimer = setTimeout( (function() {

                    this.ask( $('#q').val() );

                }).bind( this ), this._searchDelay); /* <-- Here's the solution.
                                                        I forgot to bind `this`
                                                        to the timeout callback function,
                                                        so the `this` under all of my code
                                                        was referring to the anonymous function
                                                        of this callback. */

            }).bind( this ));
        },

        ask : function( query )
        {
            // Display loader
            $('.loader').show();

            console.log(this); // Now `this` refers to my object :)

            var req = $.ajax({
                dataType : 'jsonp',
                type : 'GET',
                url : 'http://api.deezer.com/search/track/',
                context : this,
                data : {
                    output : 'jsonp',
                    q : query
                }
            });

            req.done(function(res) {
                this.loadResults(res);
            });
        },

        loadResults : function (res)
        {
            // Hide loader
            $('.loader').hide();

            // doing some stuff
            // ...
        }
    };

    return new Search;

});
define(['jquery'],函数($){
var Search=function()
{
这个。_keyDownTimer=0;
这是.\u searchDelay=1000;//ms
};
搜索引擎原型=
{
//我认为没有必要在此处发布的init函数。抱歉:/
init:function()
{
$('#q')。关于('keydown',(函数(evt)){
clearTimeout(此.\u键关闭计时器);
这个._keyDownTimer=setTimeout((函数(){
this.ask($('#q').val());
}).bind(this),this.\u searchDelay);/*您可以使用ES5函数正确设置
this

$.ajax(...).done(this.loadResults.bind(this));
(在上面的链接中使用垫片,或者在旧浏览器上使用jQuery
$.proxy
等效项)

或者,将
context:this
添加到
$。ajax
选项:

$.ajax({
    ...,
    context: this
}).done(this.loadResults);
请注意,在这两种情况下,您都将覆盖jQuery在
中传递ajax选项对象的默认行为

p、
返回
$.ajax()
链的结果也是一种很好的做法,这样对象的用户就可以将其他回调(例如
.fail
处理程序)链接到它。

您可以在这里使用
上下文
对象,如:

$.ajax({
    url : 'http://api.deezer.com/search/track/',
    context: this,
    ...
}).done(function (res) {
    this.loadResults( res );
});

有几种方法可以做到这一点

您可以设置ajax选项的
上下文设置:

上下文
设置 然而,这并没有得到广泛的支持

为此目的而创建

    .done($.proxy(function (res) {

    }, this);
将此值指定给另一个值 这通常是在JavaScript中完成的,以便在较低的范围内访问
This

带词法绑定的Arrow函数
您是否也将
this.loadResults()
更改为
this.loadResults()
?马特:是的,我想这是同样的问题。阿尔尼塔克:我在这里发布之前做过,它不会改变任何事情,因为我认为
var的范围是在.search方法的范围内定义的,当回调被触发时,
var的范围就不再存在了。我尝试过上下文:这个,通过绑定
this
到callback函数(匿名且直接在
this.loadResults
上),但我仍然得到了初始错误:(@jmpp确实,在看到您的更新
时,此
首先必须(当然)保持正确的值,才能使上述任何方法工作。还可以与
一起工作。error(function(res){…}
并可以链接到调用
this.loadResults(res)
在我的情况下不起作用,但在省略“this”时起作用,即应该是
loadResults(res)
    .done(function (res) {

    }.bind(this));
    .done($.proxy(function (res) {

    }, this);
var self = this;
$.ajax({
/* snip */
.done(function (res) {
    self.loadResults(res);
$.ajax({
/* snip */
.then(res => this.loadResults(res));