在ajax request / setTimeout中执行jQuery widget方法

时间:2014-12-15 09:28:17

标签: jquery ajax jquery-ui jquery-ui-widget-factory

我尝试在setTimeout函数中调用另一个方法,但如果我在this.install()中使用setTimeout,则找不到该方法。 我尝试了一些解决方案,但似乎没有解决它,所以我在这里问。

我的代码,记得看看我尝试做的评论:

jQuery(window).load(function () {

$.widget( "testing.updater", {

        options: {

        },

        _create: function() {

            //
            this.element.addClass('text');

            //
            this.downloadFiles('bootstrap');

        },

        downloadFiles: function(packagen) {
            var ajax = $.ajax({
                type: "POST",
                url: "responses/test.php",
                data: "download=" + packagen,
                success: function(data) {
                    var obj = jQuery.parseJSON( data);

                    $('.text').append('Downloading files...<br>');
                    $('#updateBtn').attr("disabled", true);

                    if (obj.downloaded) {
                        setTimeout(function(message){
                            $('.text').append(obj.message+'<p><p>');
                            // Down here I want to call another method
                            // like this.install(); <.. but ain't working..
                        }, 5000);
                    } else {
                        return $('.text').append('<p><p> <font color="red">'+obj.message+'</font>');
                    }

                }
            });

        },

        install: function() {
            // I want to run this method inside
            // prev method, look above comment
        },

    });

    $('#updateBtn').on('click',function(){
        var test = $('.updater').updater();
        test.updater();
    });
});

1 个答案:

答案 0 :(得分:1)

setTimeout回调中,this引用全局 - window对象。您可以在超时之前保存对象的引用,如var that = this,并将其用于引用超时内的对象,

或者您可以使用bind()方法传递上下文,如:

setTimeout(function () {
  console.log(this)
}.bind(obj), 10);