gpt4 book ai didi

javascript - 如何处理访问 javascript 中的数据结构的两个回调?

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

更新 2:我认为这是一个更好的解释:

我有两个回调,每个回调都填充一个数组。我想以某种方式合并这些数组。最简单的方法是等待数组填满,然后与 for 循环合并。我不能这样做,因为没有真正的方法来检查回调是否“完成”。

下一步可能是这样的:每次通过回调下载对象时,它都会检查合并数组(称为混合),并查看它是否包含“合作伙伴”对象。如果是:则合并到该伙伴对象中。如果没有,则插入该对象。

我担心竞争条件:回调 1 看到数组为空,决定插入其中,但随后控制切换到回调 2,它首先插入。回调 1 现在应该合并而不是插入,但是当控制权切换回来时,它会插入。

如果我可以制作一个原子的“检查和插入/合并”代码块,那么会有帮助。有办法做到这一点吗?

<小时/>

更新 1:现在有了代码,还有更多文字!

谢谢大家的回复。我去尝试尽可能地简化代码。

文字:

我有一个名为混合的数组。混合最终应为:所有类型 (A) 的对象,如果它们具有类型 (B) 的模拟对象(也称为“私有(private)”),则应将它们合并。

这意味着使用两个使用回调的函数 - getAllA 和 getAllB。现在,我调用两者,手动稍等一下,然后运行一个 for 循环来进行合并。

我需要做的是编辑我的代码,以便合并发生在回调中。但是,我想不出一种方法可以在不产生竞争条件的情况下进行合并。

天真地,我可能想首先与 A 类型的对象混合填充,然后迭代 B 对象并根据需要合并它们。但是,我不能这样做,因为无法查看 Firebase 中的 on("contact_added") 是否“完成”。我认为我想要的是一种并发数组结构,但我不知道如何使用内置数组结构。我担心自己做,因为我不知道如何检查我是否做错了。竞争条件就是这样棘手。

现在,代码:以下是您需要引用的脚本:

这是我粘贴到 JavaScript 控制台中的内容:

    //Note: private ~~ B
// public ~ A

var me = 'IWwypRHWpDmydd30o-v';
var mixed = new Array();
var mixedNames = new Array();
var privates = new Object();

var callbackB = function(snapshot){
child = snapshot.val();
privates[snapshot.name()] = child;
};

var callbackA = function(snapshot){
var listRef = snapshot.ref();
listRef.on('child_added', function (snapshot2) {
child = snapshot2.val();
mixedNames.push(snapshot2.name());
mixed.push(child);
});
};

var getAllB = function (callback, ownerid){
var priv = new Firebase('http://gamma.firebase.com/innermost/project/private/' + ownerid);
priv.on('child_added', function (snapshot){
callback(snapshot);
});
};

function getAllA(callback) {
var pub = new Firebase('http://gamma.firebase.com/innermost/project/public');
pub.once('value', function (snapshot) {
if (snapshot.val() === null) {
alert('snapshot does not exist.');
}
callback(snapshot);
});
}

getAllA(callbackA);
getAllB(callbackB, me);

//////wait

for (b in privates){
var index = $.inArray(b, mixedNames);
if (index < 0){ //if there is no record with this name
mixed.push(privates[b]);
mixedNames.push(b);
}
else{
var pub = mixed[index];
var mutt = returnMixed(pub, privates[b]);
mixed.splice(index,1,mutt);
}
};

我想要做的是将逻辑从 for 循环移至回调中,因为如果立即运行 for 循环,数组将不会通过回调完成下载。

<小时/>

旧条目:

我有两个回调访问 Firebase 上的数据列表。

回调1获取类型A的对象。回调2获取类型B的对象。

我的目标 - 拥有一个可以正确合并类型 A 和 B 的对象的数组。

大多数(但不一定是全部)B 类型的对象都有一个 A 类型的“伙伴”对象。一些 A 类型的对象有一个 B 类型的伙伴对象。

对于从 Firebase 中提取的每个对象,我想查看它们的伙伴是否在数组中。如果没有,则插入。如果是这样,则与合作伙伴“合并”。

如果没有并发数据结构,我想不出一种方法来做到这一点 - 但我不知道如何在 Javascript 中做到这一点。

我怎样才能创建并发数组,或者找出以其他方式实现我的目标的方法?

最佳答案

<script src="underscore.js"></script> <!-- or the lib of your choice -->
<script>

function addWithPartner( value, id, type ) {
var indexOfPartner = _.find(values, function(partner, i) {
// logic for determining what a partner is goes here
// for example:
return value.name == partner.name;
});

if( indexOfPartner >= 0 ) {
merge( values, indexOfPartner, value );
}
else {
values.push( value );
}
}

function merge( list, index, value ) {
// do whatever merge means here
// for example:
_.extend( list[index], value );
}

var FB = new Firebase(YOUR_URL);
var values = [];

FB.child('TYPEA').on('child_added', function(snapshot) {
addWithPartner( snapshot.val(), snapshot.name(), 'typeA' );
});

FB.child('TYPEB').on('child_added', function(snapshot) {
addWithPartner( snapshot.val(), snapshot.name(), 'typeB' );
});

</script>

关于javascript - 如何处理访问 javascript 中的数据结构的两个回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11874674/

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