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