Backbone model.fetch()回调(调用setTimeout)中的作用域问题

Scope issue within Backbone model.fetch() callback (calling setTimeout)

本文关键字:问题 setTimeout 作用域 回调 model fetch Backbone 调用      更新时间:2023-09-26

我有一个主视图(Services)与子视图(Service)的集合。每个子视图需要每5秒刷新一次。要做到这一点,我有以下[extract]:

Service: Backbone.View.extend({
    ...
    initialize: function () {
        this.model.bind('change', this.render, this);
        _.bindAll(this, 'update');
    },
    render: function () {
        ...
        this.update();
        return this;
    },
    update: function() {
        this.model.fetch();
        setTimeout(this.update, 5000);
    }
    ...

setTimeoutupdate()的调用当然有效,因为this被正确地绑定到所讨论的视图。

当我将setTimeout移动到fetch的回调时,问题出现了,因为this现在指向全局作用域:

    update: function() {
        this.model.fetch({ success: function() {
            // this is now global
            setTimeout(this.update, 5000);
        }});            
    }

如何实现连续(不重叠)更新功能。或者-我如何将视图的范围应用于fetch回调中的this ?

更新

我只是在复习这个老问题,为了将来的参考,我现在遵循这个模式,因为我在这里找到了_.bind OTT:

    update: function() {
        var self = this;
        this.model.fetch({ success: function() {
            setTimeout(self.update, 5000);
        }});            
    }

其中一个选项是使用下划线_.bind函数:

update: function() {
    this.model.fetch({ success: _.bind(function() {
        setTimeout(this.update, 5000);
    }, this)});            
}

我知道这是一个老问题,但是成功和失败事件返回三个值:模型、响应和选项。您可以调用model.update,而不是在success函数中调用this.update:

update: function() {
    this.model.fetch({ success: function( model, response, options) {
       setTimeout(model.update, 5000);
    }});            
}