gpt4 book ai didi

javascript - 从客户端调用 node.js 服务时的竞争条件

转载 作者:行者123 更新时间:2023-11-30 08:55:25 25 4
gpt4 key购买 nike

我有两个 Node 服务调用:一个是从 LDAP 组获取组成员,另一个是获取每个成员的详细信息。每个调用都是非阻塞回调,所以我遇到的情况是,有时我的记录与为个人检索的详细信息不匹配。

是否有一种聪明的方法来对此进行编码以防止竞争条件?有时它可以工作,但通常在我正在执行下面的控制台日志的行中,我正在迭代的记录与从商店返回以获取员工详细信息的记录不匹配。下面是代码:

onGroupSelected: function (list, idx, el, record) {
var store = Ext.getStore('GroupMembers');
store.getProxy().setUrl('http://people-nodejs.xxx.xxx.com/ldap/group/' + record.get('cn'));
var that = this;
store.load({
callback: function (records, operation) {
var empstore = Ext.getStore('EmployeeDetails');
Ext.each(records, function(rec, ndx) {
console.log(ndx + ":" + rec.get('memberUid'));
if (rec.get('isMember')) {
empstore.getProxy().setUrl('http://people-nodejs.xxx.xxx.com/ldap/user/' + rec.get('memberUid'));
empstore.load({
callback: function(emps, op) {
console.log(ndx + ":" + rec.get('memberUid') + "--" + emps[0].get('fullName'));
rec.set('workforceID', emps[0].get('workforceID'));
rec.set('fullName', emps[0].get('fullName'));
that.getGroupMembersList().setRecord(rec);
}
});
}
});
// Remove empty records and populate with records from above
store.removeAll();
}
});

最佳答案

在单线程环境中,比如 Javascript(和 node.js),你不可能真的有竞争条件。

相反,您遇到了 javascript 闭包,并且误解了变量在嵌套函数和循环中的工作方式。

rec 在你的 Ext.each(records, function(rec, ndx) 中定义,在你的回调函数中,你正在使用它的值,假设对于每次迭代,rec 在执行回调时仍绑定(bind)到相同的值。

这是不正确的,rec 的值是在执行回调函数时绑定(bind)的,而不是在创建函数时绑定(bind)的(本质上,这是一个关闭)。

因此,为了使其按您期望的方式工作,您需要在创建过程中强制绑定(bind) rec,方法如下(注意:语法可能有问题):

callback: (function(myrec,index){ 
return function(emps, op) {
console.log(index + ":" + myrec.get('memberUid') + "--" + emps[0].get('fullName'));
myrec.set('workforceID', emps[0].get('workforceID'));
myrec.set('fullName', emps[0].get('fullName'));
that.getGroupMembersList().setRecord(myrec);
};)(rec,ndx);

在上面的例子中,我们立即执行一个匿名 javascript 函数,传入值 rec,它在创建时被 myrec 绑定(bind)。匿名函数返回一个与回调期望的签名相同的函数,当您的回调执行该函数时,它将具有 rec

的正确值

关于javascript - 从客户端调用 node.js 服务时的竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13923256/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com