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

Javascript 如何从对象构造函数执行回调?,javascript,asynchronous,callback,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 use

我有一个像这样的对象:

    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)
它是这样设置的:

    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调用。我希望在完成回调后执行回调,最好是更改回调,我该怎么做呢?

如果您想链接,只需
返回此

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();
使用
returnthis
可以保持链的运行,您可以通过添加
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);
通过使用
.call()
应用
liveUsers
作为第一个参数,它将覆盖
this
函数最初拥有的
somethingElse
函数,并为其提供所需的上下文(使
this
===
liveUsers


希望这有帮助

如果您想链接,只需返回此

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();
使用
returnthis
可以保持链的运行,您可以通过添加
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);
通过使用
.call()
应用
liveUsers
作为第一个参数,它将覆盖
this
函数最初拥有的
somethingElse
函数,并为其提供所需的上下文(使
this
===
liveUsers


希望这有帮助

您所需要的就是实现一个回调系统。这里有一个简单的方法:

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);
});
对我来说还是有点太复杂了,为什么你需要它来连锁?为什么
用户
需要成为构造函数?为什么
用户
甚至存在,而不是简单地使用
d3.json
,而d3.json已经具备了您在问题中需要的所有功能


通常,在函数后面抽象请求的目的是避免需要指定api端点,这样,如果需要更改端点,就可以在一个地方全部更改。在这种情况下,您必须在每个请求中指定它,使函数名有点。。。没有意义,因为它可以用于从任何端点进行请求。

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

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);
});
对我来说还是有点太复杂了,为什么你需要它来连锁?为什么
用户
需要成为构造函数?为什么
用户
甚至存在,而不是简单地使用
d3.json
,而d3.json已经具备了您在问题中需要的所有功能


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

给它一个回调,或者使用任何现有的promise实现(如果d3.json还没有提供)旁注:
函数(数据)
中的值与
用户
实例中的值不同@JonathanLonowski这样的东西=self谁会更喜欢?给它一个回调,或者使用任何现有的promise实现(如果d3.json还没有提供)旁注:
这个
函数(数据)
中的值将不同于
用户
实例@JonathanLonowski那么像这样的东西=self会更受欢迎吗?但是请注意,如果
d3.json
是异步的,那么这实际上并不能解决任何问题。您仍然无法知道何时可以安全地执行
somethingElse
。在您的示例中,您将在填充数组之前执行它。。。不知怎的,我完全错过了不同步的部分。如果是这样的话,那么你就会陷入像承诺这样的事情。完全可行(我自己建立了一个名为promise的promise微库),但这个答案太长了。@plantheidea你有什么建议?要使用库,请使用一些非链接回调,或者自己构建它?对于这样一个简单的情况,@KevinB是正确的,一个简单的回调就可以了,尽管它不能链接。如果您想进入更高级的it应用程序,我建议您深入研究像q.js这样的promise库。如果这像你得到的那样强烈,那就没必要了。或者你可以试试我的微图书馆。它提供了基本的承诺和延迟功能,并且缩小了/gzip,使其小于1KB。但是请注意,如果
d3.json
是异步的,这实际上并不能解决任何问题。您仍然无法知道何时可以安全地执行
somethingElse
。在您的示例中,您将在填充数组之前执行它。。。不知怎的,我完全错过了不同步的部分。如果是这样的话,那么你就会陷入像承诺这样的事情。完全可行(我自己建立了一个名为promise的promise微库),但这个答案太长了。@plantheidea你有什么建议?要使用库,请使用一些非链接回调,或者自己构建它?对于这样一个简单的情况,@KevinB是正确的,一个简单的回调就可以了,尽管它不能链接。如果您想进入更高级的it应用程序,我建议您深入研究像q.js这样的promise库。如果这像你得到的那样强烈,那就没必要了。或者你可以试试我的微图书馆。它提供了基本的承诺和延迟功能,并且缩小了/gzip,使其小于1KB