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

Javascript 在异步函数中维护变量的状态,javascript,dojo,sametime,Javascript,Dojo,Sametime,我不知道我所问的事情是否有一个术语,所以我将尝试举例说明: 我得到了一个函数,它接收一系列联系人,并通过循环更新他们在网站上的状态。“something.getStatus”函数不返回任何内容,但成功完成后,它会给出用户的状态(在线/离线等) 这里的问题是,当调用内部函数时,变量user_id是数组中所有函数调用的最后一个变量,因此不可能知道如何拥有什么状态 function gotGroupContacts(contacts) { for ( i = 0; i < contacts.

我不知道我所问的事情是否有一个术语,所以我将尝试举例说明:

我得到了一个函数,它接收一系列联系人,并通过循环更新他们在网站上的状态。“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);
 }
}
功能gotGroupContacts(联系人){
对于(i=0;i

是否有任何方法可以“锁定”变量,或将其传递给函数?

将您的
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))
}
(i=0;i{ var user_id=联系人[i]; (功能(uid){ getStatus(uid,function(resp){ 更新状态(uid、相应状态、相应状态消息); },getStatusErrorHandler); }(用户识别号) }
user\u id
被传递到匿名自执行函数中,这将确保具有正确的值

如果您的脚本不需要与IE在闭包时读取兼容,这将给您带来好处!哇,谢谢!虽然看起来有点凌乱,但它确实有效。
function gotGroupContacts(contacts) {
  contacts.forEach(function(user_id){
     something.getStatus(user_id, function(resp) {
        updateLinkStatus(user_id, resp.status, resp.statusMessage);
     }, getStatusErrorHandler);
  });
}