如何从对象构造函数执行回调?

时间:2014-12-15 15:20:16

标签: javascript asynchronous callback

我有一个看起来像这样的对象:

    var users = function(url){
        this.users = []

        console.time("api");
        d3.json(url, function(data){
            console.timeEnd("api");
            this.users = data.data
        })
    }

它是这样安置的:

    var liveUsers = new users(apiPoint)

d3.json是一个异步的api-call。我希望在完成后再进行一次回调,最好是一个chaned,我该怎么做?

2 个答案:

答案 0 :(得分:3)

您只需要实现一个回调系统。这是一种简单的方法:

var users = function(url){
    var self = this;
    this.users = []

    console.time("api");
    d3.json(url, function(data){
        console.timeEnd("api");
        self.users = data.data
        self.cb && self.cb();
    })
    this.complete = function (fn) {
        this.cb = fn;
    };
}
var liveUsers = new users(apiEndpoint).complete(function (){
    console.log(this.users);
});

对我来说似乎有点过于复杂,为什么你需要链接?为什么users需要是构造函数?为什么users甚至存在,而不是简单地使用d3.json,它已经具有您正在寻找的所有功能,开箱即用?

通常,在函数后面抽象请求的目的是避免需要指定api端点,这样如果需要更改端点,则可以在一个地方完成。在这种情况下,您必须为每个请求指定它,使得函数的名称有点......毫无意义,因为它可以用于从任何端点请求。

答案 1 :(得分:1)

如果你想链接,只需return this

var users = function(url){
        this.users = []

        console.time("api");
        d3.json(url, function(data){
            console.timeEnd("api");
            this.users = data.data
        })

        return this;
    };

users.prototype.somethingElse = function(){
    console.log(this.users);

    return this;
};

var liveUsers = new users(apiPoint).somethingElse();

return this的使用使链保持不变,您可以通过添加prototype方法向该类添加其他功能。 this使用prototype功能保留this,但是如果您想使用另一个与该类无关的功能并且仍然使用相同的var users = function(url){ this.users = [] console.time("api"); d3.json(url, function(data){ console.timeEnd("api"); this.users = data.data }) return this; }, somethingElse = function(){ console.log(this.users); return this; }; var liveUsers = new users(apiPoint); // bunch of other codey stuffs somethingElse.call(liveUsers); ,那么您&# 39; d需要变得有点棘手:

.call()

使用liveUsers应用this作为第一个参数,它会覆盖somethingElse函数最初所具有的this,并为其提供所需的上下文(使{ {1}} === liveUsers)。

希望这有帮助!