我如何检测和分组重复方法?

时间:2016-05-10 16:00:43

标签: javascript node.js

如果对循环方法的调用是异步的,我将如何检测重复方法并按标识符对它们进行分组?

为了证明在调用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)进行了简短的实验,并且我知道我很可能需要一些方法来复制fooid s不同,虽然我无法得到任何结果,id函数返回arguments.callee

编辑:感谢您的回答!这些是问题的完美答案,但我的用例确实更进了一步。

在当前场景中,回调可能会在不确定的时间异步调用,这意味着context会在我需要之前滑回null

我编辑了上述代码和解释以反映这个新问题。

1 个答案:

答案 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;
&#13;
&#13;