Javascript 如何安全地从setTimeout回调中的数组中删除项

Javascript 如何安全地从setTimeout回调中的数组中删除项,javascript,timer,race-condition,Javascript,Timer,Race Condition,我有一个函数,它接收一个对象和一个可选的到期时间,为该对象分配一个唯一的id并将其插入数组。如果提供了过期时间,则设置超时回调,该回调通过其唯一id在数组中查找对象并将其删除 var lastId = 0; var messages = []; function add(messageObj, expiryTime) { var newId = ++lastId; messageObj['_id'] = newId; messages.push(messag

我有一个函数,它接收一个对象和一个可选的到期时间,为该对象分配一个唯一的id并将其插入数组。如果提供了过期时间,则设置超时回调,该回调通过其唯一id在数组中查找对象并将其删除

  var lastId = 0;
  var messages = [];

  function add(messageObj, expiryTime) {
    var newId = ++lastId;
    messageObj['_id'] = newId;
    messages.push(messageObj);

    if (expiryTime) {

      // find message object to remove
      setTimeout(function() {
        var index = null;
        for (var i = 0; i < messages.length; i++) {
          if (messages[i]['_id'] == newId) {
            index = i;
            break;
          }
        }

        // at this point, if another callback removes an item from the array, then we have a race condition
        messages.splice(index, 1);
      }, expiryTime);
    }
  }
var lastId=0;
var消息=[];
函数添加(messageObj,expiryTime){
var newId=++lastId;
messageObj[''u id']=newId;
messages.push(messageObj);
如果(到期时间){
//查找要删除的邮件对象
setTimeout(函数(){
var指数=零;
对于(var i=0;i

现在,我的问题是:这里是否存在竞争条件(如果存在,如何处理),或者在javascript计时器中执行此类操作是否安全?

您将获得单线程执行。没有数据竞赛。这很有趣。你介意我问一下你想用这个来构建什么吗?是的,这里没有竞争条件,比如说@squint Javascript是单线程的。@DaMaxContent没什么特别的,只是一个简单的angularjs服务,它显示通知并在一段时间后选择性地隐藏它们。啊。有棱角的我需要学习的是,你只需要执行一个线程。没有数据竞赛。这很有趣。你介意我问一下你想用这个来构建什么吗?是的,这里没有竞争条件,比如说@squint Javascript是单线程的。@DaMaxContent没什么特别的,只是一个简单的angularjs服务,它显示通知并在一段时间后选择性地隐藏它们。啊。有棱角的一些我需要学习的东西。