我有一个看起来像这样的对象:
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,我该怎么做?
答案 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
)。
希望这有帮助!