在异步函数中维护变量的状态
Maintain a state of a variable in an asynchronus function
我不知道
我问的事情是否有一个术语,所以我会尝试说明它:
我有一个函数,它接受一系列联系人,并循环访问它们以更新他们在网站上的状态。'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
相关文章:
- 在Knockoutjs中的ViewModels之间共享变量状态
- 将变量传递到php页面,作为Angular中的状态
- 在aspx页面c#之间传递/引用/发送变量/会话状态
- 作用域变量未从状态父控制器继承到子控制器
- 是否可以在reactjs中设置多个状态变量
- 在异步函数中维护变量的状态
- Angular ui路由器,通过url/url变量保存状态
- 更改控制器中ng重复中定义的变量的状态
- Node.js中的垃圾收集作用域-变量将保持设置状态多长时间
- 从数组中删除元素,然后保留其状态以备将来使用,而不使用全局变量
- 在变量中传递切换打开状态
- 如何在回调函数中获取 AngularJS 中 $scope 变量的当前状态
- AngularJS UI-if 状态变量设置值异步
- 如何在 javascript 中保存对象变量的状态
- 画布的奇怪行为 上下文变量定义位置导致选项卡处于非活动状态时画布呈现冻结
- 将 html 附加到具有三元条件的 ReactJS 中的状态变量
- 在JS中是否有任何方法来'bind'一个变量状态的函数
- Jasmine:在函数被调用之前测试变量状态
- 如何从定义函数而不是调用对象访问变量状态
- 如何在回调函数中从ajax请求之前访问变量状态