我正在尝试为需要回调的函数实现一个简单的队列。我的问题是在flush方法中,当正在执行的操作是一些长时间运行的事情(在我的情况下,indexedDB调用)时,“this”为null。我以前从未经历过这种行为,所以请教育我发生了什么事情?
以下是代码:
var Queue = (function () {
function Queue() {
};
Queue.prototype.items = [];
Queue.prototype.results = [];
Queue.prototype.add = function (action) {
this.items.push(action);
};
Queue.prototype.complete = function () { };
Queue.prototype.flush = function () {
var args = Array.prototype.slice.call(arguments);
if (args.length > 0) { this.results.push(args); }
if (this.items.length > 0) {
var action = this.items.shift();
action.call(this);
} else { // Complete, call back multi.
var results = this.results;
this.clear();
this.complete(results);
}
};
Queue.prototype.clear = function () {
this.items = [];
this.results = [];
};
Queue.create = function () {
return new Queue;
};
return Queue;
})();
答案 0 :(得分:1)
根据您提供的内容,我最好的猜测是您将Queue.prototype.flush
函数对象的引用传递给某个异步函数,因此它可以用作回调。如果这是真的,flush()
就像这样调用:
function ayncFunction(callback) {
// Do some stuff
callback();
}
ayncFunction(myQueue.flush);
......而不是像这样:
myQueue.flush();
因为函数是单独调用的,而不是对象,this
将被设置为window
(除非你使用的是strict mode,在这种情况下它是undefined
)。
您可以通过在函数中包含对myQueue.flush()
的调用来解决问题,如下所示:
var myCallback = function() {
myQueue.flush();
};
ayncFunction(myCallback);
这是有效的,因为myCallback
成为myQueue
周围的 closure 。
解决问题的另一种方法是使用 bind()
将函数绑定到其上下文(即应该调用它的对象)。