在异步函数中维护变量的状态

Maintain a state of a variable in an asynchronus function

本文关键字:变量 状态 维护 异步 函数      更新时间:2023-09-26
我不知道

我问的事情是否有一个术语,所以我会尝试说明它:

我有一个函数,它接受一系列联系人,并循环访问它们以更新他们在网站上的状态。'something.getStatus' 函数不返回任何内容,但在成功完成后,它会给出用户的状态(在线/离线/等)。

这里的问题是,当调用内部的函数时,变量 user_id 是数组中所有函数调用的最后一个,因此无法知道如何具有什么状态。

function gotGroupContacts(contacts) {
 for ( i = 0; i < contacts.length; i++) {
  var user_id = contacts[i];
  something.getStatus(user_id, function(resp) {
   updateLinkStatus(user_id, resp.status, resp.statusMessage);
  }, getStatusErrorHandler);
 }
}

有什么方法可以"锁定"变量,或以其他方式将其传递给其中的函数?

getStatus方法调用括在闭包中,如下所示

for ( i = 0; i < contacts.length; i++) {
  var user_id = contacts[i];
  (function(uid) {
     something.getStatus(uid, function(resp) {
        updateLinkStatus(uid, resp.status, resp.statusMessage);
     }, getStatusErrorHandler);
  }(user_id))
}

user_id被传递到匿名自执行函数中,这确保了具有正确的值

如果你的脚本不需要与IE <9兼容,你可以这样写:

function gotGroupContacts(contacts) {
  contacts.forEach(function(user_id){
     something.getStatus(user_id, function(resp) {
        updateLinkStatus(user_id, resp.status, resp.statusMessage);
     }, getStatusErrorHandler);
  });
}

注意:对于每个方法都可以轻松移植到IE,请参阅以下内容:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/forEach