如果对循环方法的调用是异步的,我将如何检测重复方法并按标识符对它们进行分组?
为了证明在调用callback
之前使用的时间,正在使用setTimeout
。
var counter = 0
var foo = (function () {
var context
return function foo (callback) {
if (!context) {
context = {id: ++counter}
}
setTimeout(function () {
callback.call(context)
context = null
}, 1)
}
}())
foo(function () {
console.log(1, this.id)
foo(function () {
console.log(2, this.id)
})
})
foo(function () {
console.log(3, this.id)
})
上面的代码产生:
1 1
3 undefined
2 undefined
期望的结果是:
1 1
3 2
2 1
理想情况下,无需在.bind
电话上使用foo
之类的内容即可实现此目的。
我已经使用 arguments
(更具体地说是arguments.callee
)进行了简短的实验,并且我知道我很可能需要一些方法来复制foo
与id
s不同,虽然我无法得到任何结果,id
函数返回arguments.callee
。
编辑:感谢您的回答!这些是问题的完美答案,但我的用例确实更进了一步。
在当前场景中,回调可能会在不确定的时间异步调用,这意味着context
会在我需要之前滑回null
。
我编辑了上述代码和解释以反映这个新问题。
答案 0 :(得分:0)
您可以在foo
方法的闭包中创建一个变量,该方法存储方法当前是否被调用"。这很难解释,但这就是它的样子:
var foo = (function() {
var locked;
return function (callback) {
if (!locked) {
counter += 1;
this.id = counter;
}
locked = true;
// Any time this callback calls 'foo',
// it will see it is locked and not increase the id
callback();
locked = false;
}
}());
var counter = 0;
var foo = (function() {
var locked;
return function(callback) {
if (!locked) {
counter += 1;
this.id = counter;
}
locked = true;
// Any time this callback calls 'foo',
// it will see it is locked and not increase the id
callback();
locked = false;
}
}());
foo(function() {
log([1, this.id])
foo(function() {
log([2, this.id])
})
})
foo(function() {
log([3, this.id])
})
function log(msgs) {
document.body.insertAdjacentHTML("beforeend", "<code>" + msgs.join(" ") + "</code><br />"); }
&#13;